Pagini recente » Cod sursa (job #3183573) | Cod sursa (job #3213194) | Cod sursa (job #400235) | Cod sursa (job #3252191) | Cod sursa (job #623952)
Cod sursa(job #623952)
#include<fstream>
#define Nmax 1000010
#define inf 0x7FFFFFFFFFFFFFFFLL
using namespace std;
int N,u,p,q,s[2*Nmax],d[2*Nmax],l[2*Nmax];
long long nr,c[2*Nmax],v[2*Nmax];
ifstream f("huffman.in");
ofstream g("huffman.out");
int main(){
f>>N;;
for(int i=1;i<=N;++i)
f>>v[i];
q=N+1;
p=1;
u=N;
while(p<=N){
long long mn1,mn2,mn3;
mn1=mn2=mn3=inf;
if(p<N)
mn1=v[p]+v[p+1];
if(p<=N && q>N && q<=u)
mn2=v[p]+v[q];
if(q<u)
mn3=v[q]+v[q+1];
if(mn1 <= mn2 && mn1 <= mn3){
v[++u]=mn1;
s[u]=p;
d[u]=p+1;
p+=2;
nr+=mn1;
}
else
if(mn2<=mn1 && mn2 <=mn3 ){
v[++u]=mn2;
s[u]=p;
d[u]=q;
++p;
++q;
nr+=mn2;
}
else {
v[++u]=mn3;
s[u]=q;
d[u]=q+1;
q+=2;
nr+=mn3;
}
}
while(q<u){
v[++u]=v[q]+v[q+1];
s[u]=q;
d[u]=q+1;
q+=2;
nr+=v[u];
}
for(int t=u;t>N;--t){
l[s[t]]=l[d[t]]=l[t]+1;
c[s[t]]=c[d[t]]=c[t]<<1;
++c[d[t]];
}
g<<nr<<'\n';
for(int i=1;i<=N;++i)
g<<l[i]<<' '<<c[i]<<'\n';
return 0;
}