Cod sursa(job #486752)

Utilizator S7012MYPetru Trimbitas S7012MY Data 22 septembrie 2010 18:34:45
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
/*
 * File:   main.cpp
 * Author: petru
 *
 * Created on 2010-09-21
 */


#include <cstdio>
#include <queue>
#define LL long long
#define deb(n) fprintf(stderr,"%lld ",(n));
#define DN 1000100
#define coada queue<int>
using namespace std;

struct nod {
    LL x;
    int fs,fd;
} v[2*DN];

coada c1,c2;
int n;

void dfs(int sursa,int adancime,LL val) {
    if(sursa<=n) {
        v[sursa].fs=adancime;
        v[sursa].x=val;
        return;
    }
    dfs(v[sursa].fs,adancime+1,2*val);
    dfs(v[sursa].fd,adancime+1,2*val+1);
}

int main()
{
	int i,j;
	freopen("huffman.in","r",stdin);
	freopen("huffman.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;++i) {
	    scanf("%lld",&v[i].x);
	    v[i].fs=v[i].fd=0;
	    c1.push(i);
	}
	LL rez=0;
	int m[2],cn=n;
	for(i=1; i<n;++i) {
	    for(j=0;j<2; ++j) {
	        if(c1.empty()){
	            m[j]=c2.front();
	            c2.pop();
	            continue;
	        }
	        if(c2.empty()){
	            m[j]=c1.front();
	            c1.pop();
	            continue;
	        }
	        if(v[c1.front()].x<v[c2.front()].x){
	            m[j]=c1.front();
	            c1.pop();
	            continue;
	        }
	        m[j]=c2.front();
	        c2.pop();
	    }
	    v[++cn].x=v[m[0]].x+v[m[1]].x;
	    c2.push(cn);
	    v[cn].fs=m[0];
	    v[cn].fd=m[1];
	    rez+=v[cn].x;
	}
	dfs(cn,0,0);
	printf("%lld\n",rez);
	for (i=1;i<=n;++i) printf("%d %lld\n", v[i].fs, v[i].x);
	return 0;
}