Pagini recente » Cod sursa (job #938208) | Cod sursa (job #2666535) | Cod sursa (job #1510413) | Cod sursa (job #1864653) | Cod sursa (job #1971476)
#include <fstream>
#include <algorithm>
#define nMax 1000001
#define INF 4000000000000000
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
int n, l[2], r[2], q[2][nMax], length[2*nMax], k;
long long Sol, code[2*nMax];
struct simboluri
{
long long val;
int bit[2];
}s[2*nMax];
void dfs(int node, long long cod, int len)
{
if(s[node].bit[0])
{
dfs(s[node].bit[0], 2*cod, len+1);
dfs(s[node].bit[1], 2*cod+1, len+1);
}
length[node]=len;
code[node]=cod;
}
int main()
{
fin>>n;
for(int i=1; i<=n; i++)
{
fin>>s[i].val;
q[0][i]=i;
}
if(n==1)
{
fout<<s[1].val<<'\n'<<1<<" "<<0;
return 0;
}
l[0]=l[1]=1;
r[0]=k=n;
while(l[0]+l[1]<=r[0]+r[1])
{
k++;
for(int i=0; i<2; i++)
{
int poz=0;
long long Min=INF;
for(int j=0; j<2; j++)
{
if(s[q[j][l[j]]].val<Min && l[j]<=r[j])
{
poz=j;
Min=s[q[j][l[j]]].val;
}
}
s[k].val+=Min;
s[k].bit[i]=q[poz][l[poz]];
l[poz]++;
}
Sol+=s[k].val;
q[1][++r[1]]=k;
}
dfs(k, 0, 0);
fout<<Sol<<'\n';
for(int i=1; i<=n; i++)
fout<<length[i]<<" "<<code[i]<<'\n';
}