Cod sursa(job #853936)

Utilizator gicu_01porcescu gicu gicu_01 Data 12 ianuarie 2013 16:11:03
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;


struct nod{
    long long val;
    int left_son;
    int right_son;
}a[2000001];

int n,p1,p2,p3;
long long c[2000001][2];

void init()
{
    freopen("huffman.in","r",stdin);
    freopen("huffman.out","w",stdout);
    scanf("%i",&n);
    for (int i=1; i<=n; i++)
    {
        scanf("%lld",&a[i].val);
        a[i].left_son=NULL;
        a[i].right_son=NULL;
    }
    p1=1;
    p2=n+1;
    p3=n;
}

inline int exract_min()
{
    if (p2>p3) { p1++; return p1-1; } else
        if (a[p1].val<=a[p2].val && p1<=n) { p1++; return p1-1; } else { p2++; return p2-1; }
}

void huffman()
{
    long long x,y,sum=0;
    for (int i=1; i<=n-1; i++)
    {
        x=exract_min();
        y=exract_min();
        p3++;
        a[p3].val=a[x].val+a[y].val;
        sum=sum+a[p3].val;
        a[p3].left_son=x;
        a[p3].right_son=y;
    }
    printf("%lld\n",sum);
}

void back(int p,long long s,long k)
{
    if (a[p].left_son==NULL) { c[p][0]=k+1; c[p][1]=s; } else
    {
        k++;
        back(a[p].left_son,s*2,k);
        back(a[p].right_son,s*2+1,k);
    }
}

int main()
{
    init();
    huffman();
    back(p3,0,-1);
    for (int i=1; i<=n; i++) printf("%lld %lld\n",c[i][0],c[i][1]);
    return 0;
}