Pagini recente » Cod sursa (job #3262220) | Cod sursa (job #381370) | Cod sursa (job #3287038) | Cod sursa (job #1942566) | Cod sursa (job #479331)
Cod sursa(job #479331)
#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] = 200000000;
c2[1] = 200000000;
int u = 0;
int nr = 0;
while (p2 < n-1){
if (p2 <= u && c2[p2] <= c1[p1]){
min1 = c2[p2];
stang = n+p2;
p2++;
}
else {
min1 = c1[p1];
stang = p1;
p1++;
}
if (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;
}