Cod sursa(job #1081930)

Utilizator WyvernFMI Stanescu Leonard Wyvern Data 13 ianuarie 2014 23:03:33
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fi("huffman.in");
ofstream fo("huffman.out");
struct node{
    long long val;
    int l,r;}
arb[1000100<<1];
long long code[1000100<<1][2],size=0;
int n;
long long dfs(int nod,long long cod,int depth){
    if (arb[nod].l)
        return dfs(arb[nod].l,cod<<1,depth+1)+dfs(arb[nod].r,(cod<<1)+1,depth+1);
    code[nod][0]=depth;
    code[nod][1]=cod;
    return arb[nod].val*depth;
}
int solve(){
    int p1=1,p2=n+1,len=n;
    while (p1<n||p2<len){
        arb[++len].val=0;
        if (p1<=n&&(p2>=len||arb[p1].val<=arb[p2].val)){
            arb[len].val+=arb[p1].val;
            arb[len].l=p1,p1++;}
        else {
            arb[len].val+=arb[p2].val;
            arb[len].l=p2,p2++;}
        if (p1<=n&&(p2>=len||arb[p1].val<=arb[p2].val)){
            arb[len].val+=arb[p1].val;
            arb[len].r=p1,p1++;}
        else {
            arb[len].val+=arb[p2].val;
            arb[len].r=p2,p2++;}
    }
    return len;
}
int main() {
    fi>>n;
    for (int i=1;i<=n;i++){
        fi>>arb[i].val;
        arb[i].l=arb[i].r=0;}
    fo<<dfs(solve(),0,0)<<'\n';
    for (int i=1;i<=n;i++)
        fo<<code[i][0]<<' '<<code[i][1]<<'\n';
}