Cod sursa(job #2658655)

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

using namespace std;


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()
{
    freopen("huffman.in","r",stdin);
    freopen("huffman.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&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);
    printf("%d\n",s);
    for(int i=1;i<=n;i++)
        printf("%d %lld\n",lung[i],rez[i]);
    return 0;
}