Pagini recente » Cod sursa (job #530298) | Cod sursa (job #1831022) | Cod sursa (job #530308) | Cod sursa (job #856215) | Cod sursa (job #479410)
Cod sursa(job #479410)
#include<iostream>
#include<fstream>
using namespace std;
int c1[1000010], st[2000010], dr[2000010];
long long c2[1000010];
int h[1000010], val[1000010], n;
void inordine(int nod, int hh, int v){
if (nod <= n){
h[nod] = hh;
val[nod] = v;
}
else {
inordine(st[nod], hh+1, v<<1);
inordine(dr[nod], hh+1, (v<<1)+1);
}
}
int main(){
ifstream f("huffman.in");
ofstream g("huffman.out");
int i, min1, min2, stang, drept;
f>>n;
for (i = 1; i <= n; i++)
f>>c1[i];
long long sg = 0;
int p1 = 1;
int p2 = 1;
c1[n+1] = 9223372036854775807LL;
c2[1] = 200000000;
int u = 0;
while (u < n-1){
if ((p1>n) || (c2[p2] <= c1[p1])){
min1 = c2[p2];
stang = n+p2;
p2++;
}
else {
min1 = c1[p1];
stang = p1;
p1++;
}
if ((p1>n) || (p2 <= u && c2[p2] <= c1[p1])){
min2 = c2[p2];
drept = n+p2;
p2++;
}
else {
min2 = c1[p1];
drept = p1;
p1++;
}
u++;
c2[u] = min1+min2;
sg = sg+c2[u];
st[n+u] = stang;
dr[n+u] = drept;
}
inordine(2*n-1, 0, 0);
g<<sg<<'\n';
for (i = 1; i <= n; i++)
g<<h[i]<<" "<<val[i]<<'\n';
return 0;
}