Cod sursa(job #1554595)

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

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

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

int main()
{
    ll 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;
            continue;
        }
        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;
            continue;
        }
        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;
            continue;
    }
    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=0;i<n;i++) out<<lg[i]<<" "<<c[i]<<"\n";
    in.close();
    out.close();
    return 0;
}