Cod sursa(job #2658653)

Utilizator evelina.nitoiuNitoiu Evelina evelina.nitoiu Data 14 octombrie 2020 17:32:53
Problema Coduri Huffman Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");

long long v[2000005];

typedef bool (*comp)(int,int);
bool compare(int a, int b)
{
   return (v[a]>=v[b]);
}

std::priority_queue<int,std::vector<int>, comp> pq(compare);

int n,nr;
long long s;

int mu[2000005][2];

long long rez[1000005];

int lung[1000005];

void dfs(int ind_nod,long long cod,int l){
    if(ind_nod<=n){
        rez[ind_nod]=cod;
        lung[ind_nod]=l;
        return;
    }
    dfs(mu[ind_nod][0],cod<<1,l+1);
    dfs(mu[ind_nod][1],(cod<<1)|1,l+1);
}

int main()
{
    in>>n;
    for(int i=1;i<=n;i++){
        in>>v[i];
        pq.push(i);
    }
    nr=n;
    while(pq.size()>1){
        int a,b;
        a=pq.top();
        pq.pop();
        b=pq.top();
        pq.pop();
        int c;
        nr++;
        c=nr;
        v[c]=v[a]+v[b];
        pq.push(c);
        mu[nr][0]=a;
        mu[nr][1]=b;
        s+=v[c];
    }
    dfs(nr,0,0);
    out<<s<<"\n";
    for(int i=1;i<=n;i++)
        out<<lung[i]<<" "<<rez[i]<<"\n";
    return 0;
}