Cod sursa(job #1452165)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 20 iunie 2015 10:14:08
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.46 kb
#include <fstream>
using namespace std;
ifstream f("huffman.in");
ofstream g("huffman.out");
long long N,A[1000005];
const long long INF = 1000000000000000001;
struct Node{
long long val;
long long sons[2];} Array[2000005];
int Q[1000005],R[1000005];
int ind,ind2;
long long Length[1000005],Code[1000005],node;
void Read()
{
    f>>N;
    node=N;
    for(int i=1;i<=N;i++)
        f>>Array[i].val;
}
void DFS(int node,long long level,long long code)
{
    for(int i=0;i<=1;i++)
        if(Array[node].sons[i]!=0)
            DFS(Array[node].sons[i],level+1,code*2+i);
    Length[node]=level;
    Code[node]=code;
}
void Solve()
{
    int Begin1=1,Begin2=1,counter=0;
    while(Begin1<=N || (ind==0 || Begin2<=ind))
    {
        long long x,y,z,t;
        if(Begin1>N)
            x=INF;
        else
            x=Array[Q[Begin1]].val;
        if(Begin1==N)
            y=INF;
        else
            y=Array[Q[Begin1+1]].val;
        if(Begin2>ind)
            z=INF;
        else
            z=Array[R[Begin2]].val;
        if(Begin2>=ind)
            t=INF;
        else
            t=Array[R[Begin2+1]].val;
        long long minim=min(min(x+y,x+z),z+t);
        if(minim>INF && min(min(min(x,y),z),t)<INF)
        {
            break;
        }
        if(minim>INF && min(min(min(x,y),z),t)>INF)
            break;
        if(z+t==minim)
        {
            R[++ind]=++node;
            Array[node].val=minim;
            Array[node].sons[0]=R[Begin2];
            Array[node].sons[1]=R[Begin2+1];
            Begin2+=2;
            continue;
        }
        if(x+z==minim)
        {

            R[++ind]=++node;
            Array[node].sons[0]=Q[Begin1];
            Array[node].sons[1]=R[Begin2];
            Array[node].val=minim;
            Begin1++;
            Begin2++;
            continue;
        }
        if(x+y==minim)
        {


            R[++ind]=++node;
            Array[node].sons[0]=Q[Begin1];
            Array[node].sons[1]=Q[Begin1+1];
            Array[node].val=minim;
            Begin1+=2;
            continue;
        }


    }
    while(Array[node].sons[0]==0)
        --node;
    DFS(node,0,0);
}
int main()
{
    Read();
    for(int i=1;i<=N;i++)
        Q[i]=i;
    Solve();
    long long res=0;
    for(int i=1;i<=N;i++)
        res+=Length[i]*Array[i].val;
    g<<res<<"\n";
    for(int i=1;i<=N;i++)
        g<<Length[i]<<" "<<Code[i]<<"\n";
    return 0;
}