Cod sursa(job #1701541)

Utilizator armandpredaPreda Armand armandpreda Data 13 mai 2016 13:37:44
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include <fstream>

using namespace std;

ifstream cin("huffman.in");
ofstream cout("huffman.out");

const int LIM=2000005;
int n, id=1, p, u, lvl=-1;
long long val, tot;
int readInt () {
	bool minus = false;
	int result = 0;
	char ch;
	ch = getchar();
	while (true) {
		if (ch == '-') break;
		if (ch >= '0' && ch <= '9') break;
		ch = getchar();
	}
	if (ch == '-') minus = true; else result = ch-'0';
	while (true) {
		ch = getchar();
		if (ch < '0' || ch > '9') break;
		result = result*10 + (ch - '0');
	}
	if (minus)
		return -result;
	else
		return result;
}
void w(long long a) {
    if(a != 0) {
        w(a / 10);
        putchar(a % 10 + '0');
    }
}
void write(long long a, char sep) {
    if(a == 0) putchar('0');
    else w(a);
    putchar(sep);
}
struct nod
{
    long long val;
    int st, dr;
} arb[LIM];
struct cell
{
    long long val;
    int lvl;
} ans[LIM/2];
void preord(int nod)
{
    lvl++;
    if(nod<=n)
    {
        ans[nod].lvl=lvl;
        ans[nod].val=val;
        tot+=(long long)ans[nod].lvl*arb[nod].val;
        lvl--;
        return;
    }
    val<<=1;
    preord(arb[nod].st);
    val++;
    preord(arb[nod].dr);
    val>>=1;
    lvl--;
}
int main()
{
    freopen("huffman.in", "r", stdin);
    freopen("huffman.out", "w", stdout);
    //cin>>n;
    n=readInt();
    for(int i=1; i<=n; ++i)
        //cin>>arb[i].val;
        arb[i].val=readInt();
    p=n+1, u=n;
    for(int i=1; i<n; ++i)
    {
        int fius, fiud;
        if(p>u or (id<=n and arb[id].val<arb[p].val))
            fius=id, id++;
        else
            fius=p, p++;
        if(p>u or (id<=n and arb[id].val<arb[p].val))
            fiud=id, id++;
        else
            fiud=p, p++;
        u++;
        arb[u].val=arb[fius].val+arb[fiud].val;
        arb[u].st=fius;
        arb[u].dr=fiud;
    }
    preord(2*n-1);
    //cout<<tot<<'\n';
    write(tot, '\n');
    for(int i=1; i<=n; ++i)
    {
        //cout<<ans[i].lvl<<' '<<ans[i].val<<'\n';
        write(ans[i].lvl, ' ');
        write(ans[i].val, '\n');
    }
    return 0;
}