Cod sursa(job #966515)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 26 iunie 2013 01:10:03
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<cstdio>
#include<deque>
#define LL long long
#define PLL pair<LL,LL>
#define pb push_back
#define mp make_pair
using namespace std;
const int NMAX = 1000005;
const LL INF = 1LL<<62;
int N,i,St[2*NMAX],Dr[2*NMAX],Lung[NMAX],Ninit,F[NMAX];
int Val,XA,XB,StV,StN,DrV,DrN,Sol[NMAX],Lg;
deque<PLL> A,B;
void DFS(LL Nod,LL L,LL Sum)
{
    if(St[Nod])
    {
        if(St[Nod]) DFS(St[Nod],L+1,Sum*2);
        if(Dr[Nod]) DFS(Dr[Nod],L+1,Sum*2+1);
    }
    else
    {
        Lung[Nod]=L;
        Sol[Nod]=Sum;
    }
}
int main()
{
    freopen("huffman.in","r",stdin);
    freopen("huffman.out","w",stdout);
    scanf("%d",&N);
    for(i=1;i<=N;i++)
    {
        scanf("%lld",&Val);
        A.pb(mp(Val,i));
        F[i]=Val;
    }
    for(Ninit=N;;)
    {
        if(!A.empty()) XA=A.front().first; else XA=INF;
        if(!B.empty()) XB=B.front().first; else XB=INF;
        if(XA<XB) {StV=XA; StN=A.front().second; A.pop_front();}
        else {StV=XB; StN=B.front().second; B.pop_front();}

        if(!A.empty()) XA=A.front().first; else XA=INF;
        if(!B.empty()) XB=B.front().first; else XB=INF;
        if(XA<XB) {DrV=XA; DrN=A.front().second; A.pop_front();}
        else {DrV=XB; DrN=B.front().second; B.pop_front();}

        N++; St[N]=StN; Dr[N]=DrN;
        if(A.empty() && B.empty()) break;
        B.pb(mp(StV+DrV,N));
    }
    DFS(N,0,0);
    for(i=1;i<=Ninit;i++) Lg+=F[i]*Lung[i]; printf("%lld\n",Lg);
    for(i=1;i<=Ninit;i++) printf("%d %lld\n",Lung[i],Sol[i]);
    return 0;
}