Cod sursa(job #2495766)

Utilizator Raresr14Rosca Rares Raresr14 Data 19 noiembrie 2019 20:06:10
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <bitset>
#include <cstring>
#include <climits>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
long long n,i,j,k,v[1000010],niv,m,cost,C[2000010],N[2000010],w[1000010];
pair<long long, pair<int , int> > L[2000010];
void dfs(int nod, long long cod){
    niv++;
    if(nod>n)
        cost+=L[nod].first;
    else{
        C[nod]=cod;
        N[nod]=niv;
    }
    if(L[nod].first>0){
        dfs(L[nod].second.first,cod<<1);
        dfs(L[nod].second.second,(cod<<1)+1);
    }
    niv--;
}
int main(){
    fin>>n;
    memset(v, 1, sizeof(v));
    memset(w, 1, sizeof(w));
    for(i=1;i<=n;i++){
        fin>>v[i];
    }
    k=n;
    j=1;
    i=1;
    while(k<2*n-1){
        if(v[i+1]<=w[j]){
            w[++m]=v[i]+v[i+1];
            L[++k]={w[m],{i,i+1}};
            i+=2;
            continue;
        }
        if(w[j+1]<=v[i]){
          w[++m]=w[j]+w[j+1];
          L[++k]={w[m],{n+j,n+j+1}};
          j+=2;
          continue;
        }
        w[++m]=v[i]+w[j];
        L[++k]={w[m],{i,n+j}};
        i++,j++;
    }
    niv=-1;
    dfs(2*n-1,0);
    fout<<cost<<"\n";
    for(i=1;i<=n;i++)
        fout<<N[i]<<" "<<C[i]<<"\n";
    return 0;
}