Cod sursa(job #724001)

Utilizator iuli1505Parasca Iuliana iuli1505 Data 26 martie 2012 09:41:44
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include<cstdio>
#define nmax 1000010
using namespace std;
int n,c1,c2,nr,L[2*nmax],st[nmax],dr[nmax];
long long q1[nmax],q2[nmax],cod[2*nmax],sol;
int main()
{
	int i;
	freopen("huffman.in","r",stdin);
	freopen("huffman.out","w",stdout);
	scanf("%d", &n);
	for(i=1;i<=n;i++)
		scanf("%lld", &q1[i]);
	q2[1]=q1[1]+q1[2];
	sol=q2[1];
	c1=3;
	c2=1;
	nr=1;
	st[n+1]=1;
	dr[n+1]=2;
	for(;c1<n;)
	{
		if(c2<nr)
			if(q1[c1+1]<=q2[c2]){q2[++nr]=q1[c1]+q1[c1+1];sol+=q2[nr];st[nr+n]=c1;dr[nr+n]=c1+1;c1+=2;}
			else
				if(q2[c2+1]<=q1[c1]){q2[++nr]=q2[c2]+q2[c2+1];sol+=q2[nr];st[nr+n]=c2+n;dr[nr+n]=c2+n+1;c2+=2;}
				else{q2[++nr]=q1[c1]+q2[c2];sol+=q2[nr];st[nr+n]=c1;dr[nr+n]=c2+n;c1++;c2++;}
		else
			if(c2==nr)
				if(q1[c1+1]<=q2[c2]){q2[++nr]=q1[c1]+q1[c1+1];sol+=q2[nr];st[nr+n]=c1;dr[nr+n]=c1+1;c1+=2;}	
				else{q2[++nr]=q1[c1]+q2[c2];sol+=q2[nr];st[nr+n]=c1;dr[nr+n]=c2+n;c1++;c2++;}
			else{q2[++nr]=q1[c1]+q1[c1+1];sol+=q2[nr];st[nr+n]=c1;dr[nr+n]=c1+1;c1+=2;} 
	}
	for(;c1==n&&c2<=nr;)
	{
		if(c2<nr)
		{
			if(q2[c2+1]<=q1[c1]){q2[++nr]=q2[c2]+q2[c2+1];sol+=q2[nr];st[nr+n]=c2+n;dr[nr+n]=c2+n+1;c2+=2;}
			else{q2[++nr]=q1[c1]+q2[c2];sol+=q2[nr];st[nr+n]=c1;dr[nr+n]=c2+n;c1++;c2++;}
		}
		else{q2[++nr]=q1[c1]+q2[c2];sol+=q2[nr];st[nr+n]=c1;dr[nr+n]=c2+n;c1++;c2++;}
	}
	for(;c2<nr;){q2[++nr]=q2[c2]+q2[c2+1];sol+=q2[nr];st[nr+n]=c2+n;dr[nr+n]=c2+n+1;c2+=2;}
	printf("%lld\n",sol);
	for(i=nr+n;i>n;i--)
	{
		L[st[i]]=L[i]+1;
		L[dr[i]]=L[i]+1;
		cod[st[i]]=2*cod[i];
		cod[dr[i]]=2*cod[i]+1;
	}
	for(i=1;i<=n;i++)
		printf("%d %lld\n", L[i], cod[i]);
	return 0;
}