Pagini recente » Cod sursa (job #480945) | Cod sursa (job #3030175) | Cod sursa (job #828399) | Istoria paginii runda/happy-birthday-infoarena-2014 | Cod sursa (job #473871)
Cod sursa(job #473871)
#include <stdio.h>
#define Nmax 1000002
#define INF 1000000000000000000LL
#define LL long long
struct Arbore{
int st,dr;
} Arb[2*Nmax];
LL V1[Nmax],V2[Nmax];
LL sum,Lg[Nmax],Cat[Nmax];
int n,m;
void dfs(int cine, LL cat, LL lg){
if( cine < 0 ){
Lg[-cine]=lg, Cat[-cine]=cat;
}
else{
dfs(Arb[cine].st,cat*2,lg+1);
dfs(Arb[cine].dr,cat*2+1,lg+1);
}
}
void scrie(){
int i;
printf("%lld\n",sum);
dfs(m,0,0);
for(i=1;i<=n;++i) printf("%lld ",Lg[i]),printf("%lld\n",Cat[i]);
fclose(stdin); fclose(stdout);
}
int main(){
int i,j,c1,c2; LL min1,min2;
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;++i) scanf("%lld",&V1[i]);
i=1; j=1; m=0; V2[1]=INF; V1[n+1]=INF;
while( i<=n || j<m ){
if( V1[i] < V2[j] ) c1=-i,min1=V1[i++];
else c1=j,min1=V2[j++];
if( V1[i] < V2[j] ) c2=-i,min2=V1[i++];
else c2=j,min2=V2[j++];
V2[++m]=min1+min2; V2[m+1]=INF;
Arb[m].st=c2; Arb[m].dr=c1;
sum += V2[m];
}
scrie();
return 0;
}