Cod sursa(job #1081146)

Utilizator Catalina_BrinzaBrinza Catalina Catalina_Brinza Data 13 ianuarie 2014 11:24:49
Problema Coduri Huffman Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 2.15 kb
//
//  main.cpp
//  huffman+
//
//  Created by Catalina Brinza on 1/11/14.
//  Copyright (c) 2014 Catalina Brinza. All rights reserved.
//

#include <fstream>
#include <vector>

#define nru 1000000
using namespace std;


struct nod
{
    int val;
    int cop[2];
};
nod a[2*nru];
int n;
vector <int, int> vec;
int niv[nru];
long long cod[nru],s=0;

void parcurgere(int k,long long binar, int nivel)
{
    if (a[k].cop[0]!=0)
    {
        parcurgere(a[k].cop[0],binar*2,nivel+1);
        parcurgere(a[k].cop[1],binar*2+1,nivel+1);
    }
    niv[k]=nivel;
    cod[k]=binar;
    s+=nivel*a[k].val;
    return;
}

void urcare(int k)
{
    while (vec[k].first<vec[k/2].first && k>1)
    {
        swap(vec[k],vec[k/2]);
        k=k/2;
    }
    return;
}

void coborare(int k)
{
    while (k*2+1<vec.size() && (vec[k].first>vec[k*2].first || vec[k].first>vec[k*2+1].first))
    {
        if (vec[k*2+1].first<vec[k*2].first)
        {
            swap(vec[k],vec[k*2+1]);
            k=k*2+1;
        }
        else
        {
            swap(vec[k],vec[k*2])
            k=k*2;
        }
    }
    if (k*2==vec.size()-1 && vec[k*2].first<vec[k].first) swap(vec[k],vec[k*2]);
    return;
}

void prostie()
{int m,i;
    pair <int,int > aux;
    m=n;
    while (vec.size()!=2)
    {
        ++m;
        for (i=0;i<2;++i)
        {
            aux.first=vec[1].first;
            aux.second=vec[1].second;
            swap(vec[1],vec[vec.size()-1]);
            vec.pop_back();
            coborare(1);
            a[m].cop[i]=aux.second;
            a[m].val+=aux.first;
        }
        vec.push_back(make_pair(a[m].val,m));
        swap(vec[1],vec[vec.size()-1]);
        vec.pop_back();
        coborare(1);
    }
    parcurgere(m,0,0);
    return;
}



int main()
{int i,k;
    freopen("huffman.in", "r", stdin);
    freopen("huffman.out", "w", stdout);
    scanf("%d", &n);
    vec.push_back(make_pair(0,0));
    for (i=1;i<=n;++i)
    {
         scanf("%d",&a[i].val);
        vec.push_back(make_pair(a[i].val,i));
        k=vec.size()-1;
        urcare(k);
    }
    prostie();
    printf("%lld\n", s);
    for (i=1;i<=n;++i)
    {
        printf("%d %lld\n",niv[i],cod[i]);
    }
    return 0;
}