Pagini recente » Cod sursa (job #1579875) | Cod sursa (job #30982) | Cod sursa (job #724349) | Cod sursa (job #952792) | Cod sursa (job #1865688)
#include <bits/stdc++.h>
using namespace std;
const int Nmax = 1e6+5;
const long long inf = 1LL<<60;
pair<int, int> v[2*Nmax];
long long a[2*Nmax], c[Nmax], sum=0;
int l[Nmax], p1, p2, n, nr, i, pos, L, R;
void take_two()
{
long long val1, val2, val3;
val1 = (p1<n ? a[p1]+a[p1+1] : inf);
val2 = (p2<nr ? a[p2]+a[p2+1] : inf);
val3 = (p1<=n && p2<=nr ? a[p1]+a[p2] : inf);
if(val1<=val2 && val1<=val3)
{
a[++nr] = val1;
v[nr] = {p1, p1+1};
sum += a[nr];
p1 += 2;
}
else if(val2<=val1 && val2<=val3)
{
a[++nr] = val2;
v[nr] = {p2, p2+1};
sum += a[nr];
p2 += 2;
}
else
{
a[++nr] = val3;
v[nr] = {p1, p2};
sum += a[nr];
++p1, ++p2;
}
}
int main()
{
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
scanf("%d", &n);
for(i=1; i<=n; ++i)
scanf("%d", &a[i]);
p1 = 1; p2 = n+1; nr = n;
for(i=1; i<n; ++i) take_two();
printf("%lld\n", sum);
for(i=nr; i>n; --i)
{
L = v[i].first;
R = v[i].second;
l[L] = l[R] = l[i] + 1;
c[L] = 2*c[i]; c[R] = 2*c[i]+1;
}
for(i=1; i<=n; ++i)
printf("%d %lld\n", l[i], c[i]);
return 0;
}