Cod sursa(job #1554576)

Utilizator daneel95Holteiu Daniel-Ninel daneel95 Data 21 decembrie 2015 14:42:43
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#define ll long long
using namespace std;

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

ll n,lg[1000005],s[1000005],d[1000005];
ll a[1000005],c[1000005];

int main()
{
    int i,b1,b2,e1,e2,sum=0;
    in>>n;
    for(i=0;i<n;i++) in>>a[i];
    b1=0;
    b2=n;
    e1=n;
    e2=n;
    while(b1<n)
    {
        if((b2==e2) || (e1-b1>1 && e2>b2 && a[b1+1]<=a[b2]))
        {
            a[e2]=a[b1]+a[b1+1];
            s[e2]=b1;
            d[e2]=b1+1;
            e2++;
            b1+=2;
        }else if((b1==e1) || (e2-b2>1 && e1>b1 && a[b2+1]<=a[b1]))
            {
                a[e2]=a[b2]+a[b2+1];
                s[e2]=b2;
                d[e2]=b2+1;
                e2++;
                b2+=2;
            }else{
                a[e2]=a[b1]+a[b2];
                s[e2]=b1;
                d[e2]=b2;
                e2++;
                b1++;
                b2++;
            }
    }
    while(e2<2*n-1)
    {
            a[e2]=a[b2]+a[b2+1];
            s[e2]=b2;
            d[e2]=b2+1;
            e2++;
            b2+=2;
    }
    for(i=e2-1;i>=n;i--)
    {
        c[s[i]]=2*c[i];
        c[d[i]]=2*c[i]+1;
        lg[s[i]]=lg[d[i]]=lg[i]+1;
        sum+=a[i];
    }
    out<<sum<<"\n";
    for(i=1;i<=n;i++) out<<lg[i]<<" "<<c[i]<<"\n";
    in.close();
    out.close();
    return 0;
}