Cod sursa(job #1866453)

Utilizator xtreme77Patrick Sava xtreme77 Data 3 februarie 2017 08:06:43
Problema Coduri Huffman Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <queue>

using namespace std ;

ifstream cin ("huffman.in");
ofstream cout ("huffman.out") ;

const int MAX = 1e6 + 14 ;

struct Node {

	int freq ;
	int st ;
	int dr ;
	int nr ;
} v [4 * MAX] ;

int nNodes = 0 ;

int Cr ( int f , int l, int r, int number ) {
	++ nNodes ;
	v [nNodes].freq = f ;
	v [nNodes].st = l ;
	v [nNodes].dr = r ;
	v [nNodes].nr = number ;
	return nNodes ;
}

class cmp {
	public :
	bool operator () ( const Node &a, const Node &b ) const {
		return a.freq > b.freq ;
	}
};

priority_queue < Node, vector <Node>, cmp > H ;

pair < int , long long > Sol [MAX] ;
int n ;

void dfs ( int nod , long long base , int cate )
{
	if ( nod <= n ) {
		Sol [nod] = make_pair (cate, base) ;
		return ;
	}
	dfs ( v [nod].st, base << 1LL , cate + 1 ) ;
	dfs ( v [nod].dr, base << 1LL | 1LL , cate + 1 ) ;
}

int main()
{
	cin >> n ;
	for ( int i = 1 ; i <= n ; ++ i ) {
		int x ;
		cin >> x ;
		v [i].freq = x ;
		v [i].st = i ;
		v [i].dr = i ;
		v [i].nr = i ;
		H.push (v[i]) ;
	}
	nNodes = n ;
	while ( H.size() > 1 ) {
		Node Aux1 = H.top() ; H.pop() ;
		Node Aux2 = H.top() ; H.pop() ;

		int partial_root = Cr ( Aux1.freq + Aux2.freq, Aux1.nr , Aux2.nr, 0) ;
		v [partial_root].nr = partial_root ;
		H.push (v[partial_root]) ;
	}
	dfs (nNodes, 0, 0) ;
	long long len = 0 ;
	for ( int i = 1 ; i <= n ; ++ i ) {
		len = len + 1LL * v [i].freq * Sol [i].first ;
	}
	cout << len << '\n' ;
	for ( int i = 1 ; i <= n ; ++ i ) {
		cout << Sol [i].first << ' ' << Sol [i].second << '\n' ;
	}
	return 0 ;
}