Cod sursa(job #824849)

Utilizator maritimCristian Lambru maritim Data 27 noiembrie 2012 01:07:46
Problema Coduri Huffman Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<stdio.h>
#include<queue>
using namespace std;

FILE *f = fopen("huffman.in","r");
FILE *g = fopen("huffman.out","w");

typedef struct _nod
{
    long long info;
    int F[2];
} nod;

#define MaxN 1000100
#define MaxP 2
#define ll long long

int N;
ll Sol,SolV[MaxN][MaxP];
nod A[(MaxN<<1)+100];

void citire(void)
{
    int a;

    fscanf(f,"%d ",&N);
    for(int i=1;i<=N;i++)
        fscanf(f,"%lld",&A[i].info);
}

inline void creare(int poz,int depth,int nr)
{
    if(poz <= N)
    {
        SolV[poz][0] = depth;
        SolV[poz][1] = nr;

        return ;
    }

    creare(A[poz].F[0],depth+1,nr*2);
    creare(A[poz].F[1],depth+1,nr*2+1);
}

void Rezolvare(void)
{
    int pozA = 1,pozB = N+1,pozNOU = N,pozF;
    ll min;

    for(int i=1;i<N;i++)
    {
        if(pozA > N || (pozB <= pozNOU && A[pozA].info > A[pozB].info))
            min = A[pozB].info,pozF = pozB++;
        else
            min = A[pozA].info,pozF = pozA++;
        A[pozNOU+1].info = min; A[pozNOU+1].F[0] = pozF;

        if(pozA > N || (pozB <= pozNOU && A[pozA].info > A[pozB].info))
            min = A[pozB].info,pozF = pozB++;
        else
            min = A[pozA].info,pozF = pozA++;

        A[pozNOU+1].info += min; A[pozNOU+1].F[1] = pozF;

        Sol += A[++pozNOU].info;
    }

    creare(pozNOU,0,0);
}

int main()
{
    citire();
    Rezolvare();

    fprintf(g,"%lld\n",Sol);
    for(int i=1;i<=N;i++)
        fprintf(g,"%lld %lld\n",SolV[i][0],SolV[i][1]);
}