Cod sursa(job #492492)

Utilizator FlorianFlorian Marcu Florian Data 14 octombrie 2010 19:07:24
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
using namespace std;
#include<fstream>
const int MAX_N = 1000007;
const int oo = 0x3f3f3f3f;
#define ll long long
int V[2*MAX_N], lg[MAX_N], poz[MAX_N];
ll val[MAX_N];
int fs[2*MAX_N], fd[2*MAX_N], N, K;
int C[2*MAX_N], P, Q, U, SOL;
void DFS(int X, int h, ll nr)
{
	if(!X) return;
	if( X <= N )
	{
        lg[X] = h;
		val[X] = nr;
	}
	DFS( fs[X], h + 1, nr + (1<<h) );
	DFS( fd[X], h + 1, nr );
}
int main()
{
	ifstream in("huffman.in"); ofstream out("huffman.out");
	in>>N;
	int i, X, Y;
	for(i = 1; i <= N; ++i) in>>V[i];
	Q = 1;
	V[0] = oo;
	for(i = N + 1; i < 2*MAX_N; ++i) V[i] = oo;
	K = N + 1;  P = 1;
	while( ( N - Q + 1 + U - P + 1 ) > 1 )
	{
		if( V[Q] < V[ C[P ] ] )
		{
			X = Q;
			if( V[Q+1] < V[ C[P] ] ) Y = Q + 1, ++Q;
			else Y = C[P], ++P;
			++Q;
		}
		else
		{
			X = C[P];
			if( V[Q] < V[ C[P+1] ] ) Y = Q, ++Q;
			else Y = C[P+1], ++P;
			++P;
		}
        ++K;
		V[K] = V[X] + V[Y];
		if( V[X] == oo || V[Y] == oo ) break; //{ out<<K<<" " <<X<<" "<<Y<<"\n"; }
		SOL += V[K];
		fs[K] = X; fd[K] = Y;
		C[++U] = K;
	}
	DFS( K, 0, 0 );
//    for(i = 1; i <= K; ++i) out<<V[i]<<" ";
   // out<<"\n"<<K<<"\n";
    out<<SOL<<"\n";
    for(i = 1; i <= N; ++i)
	    out<<lg[i]<<" "<<val[i]<<"\n";
}