Pagini recente » Cod sursa (job #339823) | Cod sursa (job #2342209) | Borderou de evaluare (job #331569) | Cod sursa (job #2321761) | Cod sursa (job #2984213)
#include <bits/stdc++.h>
using namespace std;
queue <int> q1, q2;
int v[2000001];
int st[2000001], dr[2000001];
int best()
{
int x;
if(!q1.size())
{
x = q2.front();
q2.pop();
}
else if(!q2.size())
{
x = q1.front();
q1.pop();
}
else if(v[q1.front()] < v[q2.front()])
{
x = q1.front();
q1.pop();
}
else
{
x = q2.front();
q2.pop();
}
return x;
}
int val[2000001], len[2000001];
void dfs(int nod)
{
if(st[nod])
{
val[st[nod]] = val[nod] * 2;
len[st[nod]] = len[nod] + 1;
dfs(st[nod]);
}
if(dr[nod])
{
val[dr[nod]] = val[nod] * 2 + 1;
len[dr[nod]] = len[nod] + 1;
dfs(dr[nod]);
}
}
int main()
{
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> v[i];
q1.push(i);
}
while(q1.size() + q2.size() > 1)
{
int p1, p2;
p1 = best();
p2 = best();
v[++n] = v[p1] + v[p2];
st[n] = p1;
dr[n] = p2;
q2.push(n);
}
dfs(n);
int rez = 0;
for(int i = (n + 1) / 2 + 1; i <= n; i++)
rez += v[i];
cout << rez << '\n';
for(int i = 1; i <= (n + 1) / 2; i++)
cout << len[i] << " " << val[i] << '\n';
return 0;
}