Pagini recente » Cod sursa (job #412813) | Cod sursa (job #1088929) | Cod sursa (job #170063) | Cod sursa (job #1173987) | Cod sursa (job #1971483)
#include <fstream>
#include <algorithm>
#include <cstdio>
#define buffMax 1000
#define nMax 1000001
#define INF 4000000000000000
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
int l[2], r[2], q[2][nMax], length[2*nMax], k, poz;
char buff[buffMax];
long long Sol, code[2*nMax], n;
void read(long long &nr)
{
nr=0;
while(buff[poz]<'0' || buff[poz]>'9')
{
poz++;
if(poz==buffMax)
{
poz=0;
fread(buff, 1, buffMax, stdin);
}
}
while(buff[poz]>='0' && buff[poz]<='9')
{
nr=nr*10+buff[poz]-'0';
poz++;
if(poz==buffMax)
{
poz=0;
fread(buff, 1, buffMax, stdin);
}
}
}
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()
{
freopen("huffman.in", "r", stdin);
fread(buff, 1, buffMax, stdin);
read(n);
for(int i=1; i<=n; i++)
{
read(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';
}