Pagini recente » Cod sursa (job #1190052) | Cod sursa (job #3258081) | Cod sursa (job #386440) | Cod sursa (job #30843) | Cod sursa (job #2415158)
#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)
{
cout<<node<<' ';
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<pair<ll,int>> extr;
queue<pair<ll,int>> 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())
{
mi[j]=intr.front();
intr.pop();
}
else if(intr.empty())
{
mi[j]=extr.front();
extr.pop();
}
else if(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;
}