Pagini recente » Cod sursa (job #2728646) | Cod sursa (job #1246538) | Cod sursa (job #2504480) | Cod sursa (job #2152115) | Cod sursa (job #1067060)
#include<iostream>
#include<cstdio>
using namespace std;
typedef struct un_nod{
long long val;
long st;
long dr;
}nodul;
nodul nod[2000200];
long long codul[1000100];
long nivelul[1000100];
void DF(long poz, long long cod, long nivel)
{
if(nod[poz].st!=-1)
{
DF(nod[poz].st, 2*cod, nivel+1);
DF(nod[poz].dr, 2*cod+1, nivel+1);
}
codul[poz]=cod;
nivelul[poz]=nivel;
}
long long c[2000200];
long v[1000100];
int main()
{
FILE *fin, *fout;
fin=fopen("huffman.in", "r");
fout=fopen("huffman.out", "w");
long i, n, ultimv, primv, ultimc, primc, k;
long long s, m;
fscanf(fin, "%ld", &n);
for(i=0; i<n; i++)
{
fscanf(fin, "%ld", &v[i]);
nod[i].val=v[i];
nod[i].st=-1;
nod[i].dr=-1;
}
c[1]=v[0]+v[1];
ultimv=n-1;
primv=2;
primc=1;
ultimc=1;
s=0;
nod[n].val=c[1];
nod[n].st=0;
nod[n].dr=1;
k=n+1;
int nr=0;
while(primv<=ultimv || primc<=ultimc)
{
if(primv>ultimv)
{
ultimc++;
c[ultimc]=c[primc]+c[primc+1];
primc+=2;
nod[k].val=c[ultimc];
nod[k].st=primc-2+n-1;
nod[k].dr=primc+n-1-1;
k++;
nr++;
}
else
{
if(v[primv]<=c[primc] )
{
/*ultimc++;*/
m=v[primv];
primv++;
nod[k].st=primv-1;
}
else
{
/*ultimc++;*/
m=c[primc];
primc++;
nod[k].st=primc+n-1-1;
}
if(primv<=ultimv && primc>ultimc)
{
ultimc++;
c[ultimc]=m+v[primv];
primv++;
nod[k].val=c[ultimc];
nod[k].dr=primv-1;
k++;
}
else
{if(primv>ultimv || v[primv]>c[primc])
{
ultimc++;
c[ultimc]=m+c[primc];
primc++;
nod[k].val=c[ultimc];
nod[k].dr=primc+n-1-1;
k++;
}
else
{
ultimc++;
c[ultimc]=m+v[primv];
primv++;
nod[k].val=c[ultimc];
nod[k].dr=primv-1;
k++;
}
}
}
}
DF(k-2, 0, 0);
for(i=1; i<ultimc; i++)
{
s+=(long long)c[i];
}
fprintf(fout,"%lld\n", s);
for(i=0; i<n; i++)
fprintf(fout, "%ld %lld\n", nivelul[i], codul[i]);
}