Cod sursa(job #824851)

Utilizator maritimCristian Lambru maritim Data 27 noiembrie 2012 01:29:05
Problema Coduri Huffman Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 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;
int SolVA[MaxN];
ll SolVB[MaxN];
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,ll nr)
{
    if(poz <= N)
    {
        SolVA[poz] = depth;
        SolVB[poz] = 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,0LL);
}

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

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