Cod sursa(job #1464712)

Utilizator acomAndrei Comaneci acom Data 24 iulie 2015 12:28:54
Problema Coduri Huffman Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.39 kb
#include<fstream>
using namespace std;
#define NMAX 1000005
ifstream fin("huffman.in");
ofstream fout("huffman.out");
struct nod
{
    long long cod;
    int lung;
    int f[2];
} V[NMAX<<2];
int n,k,p,u,A[NMAX];
long long B[NMAX];
long long lg;
char BUFF[NMAX<<4],*q=BUFF;
void read(int &nr)
{
    nr=0;
    while ('0'<=*q && *q<='9')
        nr=nr*10+*q-'0', ++q;
    while (!('0'<=*q && *q<='9'))
        ++q;
}
void bfs(int x, long long cod, int lung)
{
    V[x].cod=cod, V[x].lung=lung;
    if (V[x].f[0])
    {
        bfs(V[x].f[0],cod*2,lung+1);
        bfs(V[x].f[1],cod*2+1,lung+1);
    }
}
int main()
{
    int i;
    fin.get(BUFF,NMAX<<4,0);
    read(n);
    for (i=1;i<=n;++i)
        read(A[i]);
    k=1, p=1, u=0;
    while (k<=n)
    {
        if (p<=u)
        {
            if (k<n)
            {
                if (B[p]>=A[k+1])
                {
                    B[++u]=A[k]+A[k+1];
                    V[u+n].f[0]=k, V[u+n].f[1]=k+1;
                    ++++k;
                }
                else
                {
                    if (p<u && B[p+1]<A[k])
                    {
                        B[++u]=B[p]+B[p+1];
                        V[u+n].f[0]=p+n, V[u+n].f[1]=p+n+1;
                        ++++p;
                    }
                    else
                    {
                        B[++u]=A[k]+B[p];
                        V[u+n].f[0]=k, V[u+n].f[1]=p+n;
                        ++k, ++p;
                    }
                }
            }
            else
            {
                if (p<u && B[p+1]<A[k])
                {
                    B[++u]=B[p]+B[p+1];
                    V[u+n].f[0]=p+n, V[u+n].f[1]=p+n+1;
                    ++++p;
                }
                else
                {
                    B[++u]=A[k]+B[p];
                    V[u+n].f[0]=k, V[u+n].f[1]=p+n;
                    ++k, ++p;
                }
            }
        }
        else
        {
            B[++u]=A[k]+A[k+1];
            V[u+n].f[0]=k, V[u+n].f[1]=k+1;
            ++++k;
        }
        lg+=B[u];
    }
    while (p<u)
    {
        B[++u]=B[p]+B[p+1];
        V[u+n].f[0]=p+n, V[u+n].f[1]=p+n+1;
        ++++p;
        lg+=B[u];
    }
    bfs(2*n-1,0,0);
    fout<<lg<<"\n";
    for (i=1;i<=n;++i)
        fout<<V[i].lung<<" "<<V[i].cod<<"\n";
    return 0;
}