Cod sursa(job #2415132)

Utilizator HaesteinnSabau Florin Vlad Haesteinn Data 25 aprilie 2019 16:04:35
Problema Coduri Huffman Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>
using namespace std;
#define NMAX 2000010
#define F first
#define S second
ifstream fin("huffman.in");
ofstream fout("huffman.out");

typedef long long ll;
typedef pair<ll,ll> pii;

int n;
pair<ll,ll> ans[NMAX/2];
pair<int,int> adj[NMAX];
ll lg=0;

void dfs(int node,long long depth,long long nr)
{
    if(node<=n)
    {
        ans[node]={depth,nr};
        return;
    }
    dfs(adj[node].F,depth+1,nr<<1);
    dfs(adj[node].S,depth+1,(nr<<1)+1);
}

int main()
{
    fin.sync_with_stdio(0);
    fout.sync_with_stdio(0);

    fin>>n;
    queue<pii> extr,intr;

    for(int i=1;i<=n;i++)
    {
        int x;
        fin>>x;
        extr.push({x,i});
    }

    for(int i=1;i<n;i++)
    {
        pair<ll,int> mi[2];
        for(int j=0;j<2;j++)
        {
            if(extr.empty()||intr.front().F<extr.front().F)
            {
                mi[j]=intr.front();
                intr.pop();
            }
            else
            {
                mi[j]=extr.front();
                extr.pop();
            }
        }
        adj[i+n].F=mi[0].S;
        adj[i+n].S=mi[1].S;
        lg+=mi[0].F+mi[1].F;
        intr.push({mi[0].F+mi[1].F,i+n});
    }
    dfs(2*n-1,0,0);
    fout<<lg<<'\n';
    for(int i=1;i<=n;i++)
        fout<<ans[i].F<<' '<<ans[i].S<<'\n';


    return 0;
}