Pagini recente » Cod sursa (job #2249697) | Cod sursa (job #2139019) | Cod sursa (job #1879190) | Cod sursa (job #766180) | Cod sursa (job #968360)
Cod sursa(job #968360)
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <bitset>
#include <queue>
#include <deque>
#include <list>
#include <set>
#include <ctime>
#include <string>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;
ifstream ff("huffman.in");
ofstream gg("huffman.out");
#define max 1000013
struct huf{ long long v, x; int k,l; struct huf *s,*d;
huf(long long v0=0,int k0=0){v=v0;k=k0;s=d=0;}
huf(long long v0, huf *s0, huf *d0){v=v0;s=s0;d=d0;k=-1;} }*h,
*qq[2][max];
int n, ll[max];
long long vv[max];
long long dfs(huf *r){
huf *g;
int p, u;
long long t=0;
r->l=0; r->x=0;
qq[0][p=u=0]=r;
while(p<=u){
g=qq[0][p++];
if(g->s==0 && g->d==0){
vv[g->k]=g->x;
ll[g->k]=g->l;
t+=g->l*g->v;
}
if(g->s!=0){
g->s->l=g->l+1;
g->s->x=g->x*2;
qq[0][++u]=g->s;
}
if(g->d!=0){
g->d->l=g->l+1;
g->d->x=g->x*2+1;
qq[0][++u]=g->d;
}
}
return t;
}
void arb(){
huf *s,*d;
int p, u, i;
p=1; u=0; i=0;
while((i<n || p<=u)){
if(i==n || (p<=u && qq[1][p]->v<qq[0][i]->v))s=qq[1][p++]; else
s=qq[0][i++];
if(i==n || (p<=u && qq[1][p]->v<qq[0][i]->v))d=qq[1][p++]; else
d=qq[0][i++];
if(s==0||d==0){ break; }
qq[1][++u]=new huf(s->v+d->v, s, d);
}
h=qq[1][u];
gg << dfs(h) << "\n";
for(int i=0;i<n;i++) gg << ll[i] << " " << vv[i] << "\n";
}
int main(){
ff >> n;
for(int i=0;i<n;i++){
ff >> vv[i];
qq[0][i]=new huf(vv[i],i);
}
arb();
}