Pagini recente » Cod sursa (job #1755101) | Cod sursa (job #799068) | Cod sursa (job #410938) | Cod sursa (job #1981484) | Cod sursa (job #456747)
Cod sursa(job #456747)
#include <cstdio>
using namespace std;
#define NMAX 100100
typedef long long int64;
struct node{
int64 val;
int l,r;
}arb[NMAX<<1];
int64 code[NMAX<<1][2],size=0;
int n;
int dfs(int nod,int64 cod,int depth){
if(arb[nod].l){
return dfs(arb[nod].l,cod<<1,depth+1)+dfs(arb[nod].r,(cod<<1)+1,depth+1);
}
code[nod][0]=depth;
code[nod][1]=cod;
return arb[nod].val*depth;
}
int solve(){
int p1=1,p2=n+1,len=n;
while(p1 < n || p2 < len){
arb[++len].val=0;
if(p1<=n && (p2 >= len || arb[p1].val <= arb[p2].val)){
arb[len].val += arb[p1].val;
arb[len].l = p1,p1++;
}else{
arb[len].val += arb[p2].val;
arb[len].l = p2,p2++;
}
if(p1<=n && (p2 >= len || arb[p1].val <= arb[p2].val)){
arb[len].val += arb[p1].val;
arb[len].r = p1,p1++;
}else{
arb[len].val += arb[p2].val;
arb[len].r = p2,p2++;
}
}
return len;
}
int main(){
FILE* fin=fopen("huffman.in","r");
FILE* fout=fopen("huffman.out","w");
fscanf(fin,"%d ",&n);
for(int i=1;i<=n;i++){
fscanf(fin,"%lld ",&arb[i].val);
arb[i].l=arb[i].r=0;
}
fprintf(fout,"%d\n",dfs(solve(),0,0));
for(int i=1;i<=n;i++){
fprintf(fout,"%lld %lld\n",code[i][0],code[i][1]);
}
fclose(fin);
fclose(fout);
}