Pagini recente » Cod sursa (job #2361417) | Cod sursa (job #848241) | Cod sursa (job #2429934) | Cod sursa (job #1909882) | Cod sursa (job #2415118)
#include <bits/stdc++.h>
using namespace std;
#define NMAX 2000005
#define F first
#define S second
ifstream fin("huffman.in");
ofstream fout("huffman.out");
typedef pair<int,int> pii;
int n;
pair<int,long long> ans[NMAX/2];
pii adj[NMAX];
long long lg=0;
int v[NMAX/2];
void dfs(int node,int depth,long long nr)
{
if(node<=n)
{
lg+=v[node]*depth;
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++)
{
fin>>v[i];
extr.push({v[i],i});
}
for(int i=1;i<n;i++)
{
pii 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;
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;
}