Mai intai trebuie sa te autentifici.

Cod sursa(job #2573601)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 5 martie 2020 18:19:19
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
#define DIM 1000010
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
long long n,m,i,j,k,t,niv,cost,v[DIM],w[DIM],l[DIM],c[DIM];
pair<long long, pair<int,int> > L[2*DIM];
void dfs(int nod, long long cod) {
    niv++;
    if (nod>n)
        cost+=L[nod].first;
    else
        c[nod]=cod, l[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() {
    memset(v,1,sizeof(v));
    memset(w,1,sizeof(w));
    fin>>n;
    for (i=1;i<=n;i++)
        fin>>v[i];
    i=j=1, k=n, t=2*k-1;
    while (k<t) {
        //alegem v[i] si v[i+1]
        if (v[i+1]<=w[j]) {
            L[++k]={v[i]+v[i+1],{i,i+1}};
            w[++m]=v[i]+v[i+1];
            i+=2;
        }
        //alegem w[j] si w[j+1]
        else if (w[j+1]<=v[i]) {
            L[++k]={w[j]+w[j+1],{n+j,n+j+1}};
            w[++m]=w[j]+w[j+1];
            j+=2;
        }
        //alegem v[i] si w[j]
        else {
            L[++k]={v[i]+w[j],{i,n+j}};
            w[++m]=v[i]+w[j];
            i++, j++;
        }
    }
    niv=-1;
    dfs(2*n-1,0);
    fout<<cost<<"\n";
    for (i=1;i<=n;i++)
        fout<<l[i]<<" "<<c[i]<<"\n";
    return 0;
}