Pagini recente » Cod sursa (job #1897695) | Cod sursa (job #3169154) | Cod sursa (job #1920878) | Cod sursa (job #418665) | Cod sursa (job #1759511)
#include<stdio.h>
using namespace std;
FILE *f1=fopen("huffman.in","r");
FILE *f2=fopen("huffman.out","w");
int n,l[2],r[2],i,q[2][1000001];
long long b[1000001],lg[1000001],sol,Min,inf=1000000000000000;
struct nod{
long long v;
int f[2];
}arb[2000002];
void dfs(int poz,long long cod,long long nivel){
if (arb[poz].f[0]){
dfs(arb[poz].f[0],cod*2,nivel+1);
dfs(arb[poz].f[1],cod*2+1,nivel+1);
return;
}
lg[poz]=nivel;
b[poz]=cod;
}
void rezolva(){
int p,i,j,k;
k=n;
l[0]=l[1]=1;
r[0]=n;
while(l[0]+l[1]<=r[0]+r[1]){
k++;
for (j=0;j<2;j++){
p=0;
Min=inf;
for (i=0;i<2;i++)
if (Min>arb[q[i][l[i]]].v && l[i]<=r[i]){
Min=arb[q[i][l[i]]].v;
p=i;
}
arb[k].f[j]=q[p][l[p]];
arb[k].v+=arb[q[p][l[p]]].v;
l[p]++;
}
sol+=arb[k].v;
r[1]++;
q[1][r[1]]=k;
}
dfs(k,0,0);
}
int main(){
fscanf(f1,"%d",&n);
for (i=1;i<=n;i++){
fscanf(f1,"%lld",&arb[i].v);
q[0][i]=i;
}
fclose(f1);
rezolva();
fprintf(f2,"%lld\n",sol);
for (i=1;i<=n;i++)
fprintf(f2,"%lld %lld\n",lg[i],b[i]);
fclose(f2);
return 0;
}