Pagini recente » Cod sursa (job #2212415) | Cod sursa (job #2109398) | Cod sursa (job #2840557) | Cod sursa (job #1867016) | Cod sursa (job #977476)
Cod sursa(job #977476)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
#define f first
#define s second
#define cod1 (code << 1)
#define cod2 cod1 + 1
ifstream fin("huffman.in");
ofstream fout("huffman.out");
const int N = 1000010;
int lg[N];
long long n, lgmin, vf, v[N*2], cod[N];
vector < pair <int, int> > fiu(2*N);
queue <int> q1, q2;
void dfs(int nod, int height, long long code)
{
if(nod > n)
{
lgmin += v[nod];
dfs(fiu[nod].f, height + 1, cod1);
dfs(fiu[nod].s, height + 1, cod2);
}
else
{
lg[nod] = height;
cod[nod] = code;
}
}
int Extract_Min()
{
int mini;
if(q1.empty())
{
mini = q2.front(); q2.pop();
return mini;
}
if(q2.empty())
{
mini = q1.front(); q1.pop();
return mini;
}
if(v[q1.front()] < v[q2.front()])
{
mini = q1.front(); q1.pop();
return mini;
}
mini = q2.front(); q2.pop();
return mini;
}
int main()
{
fin>>n;
for(int i=1; i<=n; i++)
{q1.push(i); fin>>v[i];}
int min1, min2; vf = n;
while(q1.size() + q2.size() > 1)
{
min1 = Extract_Min();
min2 = Extract_Min();
v[++vf] = v[min1] + v[min2];
fiu[vf].f = min1;
fiu[vf].s = min2;
q2.push(vf);
}
dfs(vf, 0, 0);
fout<<lgmin<<'\n';
for(int i=1; i<=n; i++)
fout<<lg[i]<<' '<<cod[i]<<'\n';
return 0;
}