Pagini recente » Cod sursa (job #164725) | Cod sursa (job #543790) | Cod sursa (job #1189010) | Cod sursa (job #2945169) | Cod sursa (job #486752)
Cod sursa(job #486752)
/*
* 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;
}