Cod sursa(job #2294629)

Utilizator danielsociuSociu Daniel danielsociu Data 2 decembrie 2018 17:03:21
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
std::ifstream cin("huffman.in");
std::ofstream cout("huffman.out");
#define maxn 1000099
#define inf 1LL * 1000000000 * 1000000000

long long b[maxn],SOL;
int lg[maxn],l[2],r[2];
int n,q[2][maxn],k;
struct nod{
	long long val;
	int f[2];
}nod[2*maxn];

void huffman(long,long long,int);
void solve();

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>nod[i].val;
		q[0][i]=i;
	}
	solve();
	cout<<SOL<<'\n';
	for(int i=1;i<=n;i++)
		cout<<lg[i]<<' '<<b[i]<<'\n';
	return 0;
}

void huffman(long nodul,long long cod,int nivel)
{
	if(nod[nodul].f[0]){
		huffman(nod[nodul].f[0],cod*2,nivel+1);
		huffman(nod[nodul].f[1],cod*2+1,nivel+1);
		return;
	}
	lg[nodul]=nivel;
	b[nodul]=cod;
}

void solve()
{
	int i,j,p;
	long long m;
	k=n;
	l[0]=l[1]=1;
	r[0]=n;
	while(l[0]+l[1]<=r[0]+r[1])
	{
		++k;
		for(i=0;i<2;i++){
			m=inf,p=0;
			for(j=0;j<2;j++)
				if(nod[q[j][l[j]]].val<m&&l[j]<=r[j])
					m=nod[q[j][l[j]]].val,p=j;
			nod[k].val+=m;
			nod[k].f[i]=q[p][l[p]++];
		}
		SOL+=nod[k].val;
		q[1][++r[1]]=k;
	}
	huffman(k,0,0);
}