Pagini recente » Cod sursa (job #851504) | Cod sursa (job #100971) | Cod sursa (job #202470) | Istoria paginii runda/iconcurs10/clasament | Cod sursa (job #1994889)
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
queue <pair<long long,long long> > deCit;
queue <pair<long long,long long> > deLucrat;
int n,auxN;
int dist[2000003];
struct node
{
int indiceTata;
long long bit;
} PARENT[2000003];
void citire()
{
long long aux;
scanf("%d",&n);
auxN=n;
for(long long i=1; i<=n; i++)
{
scanf("%lld",&aux);
deCit.push(make_pair(aux,i));
}
}
pair<long long,long long> getMin()
{
pair<long long,long long> rasp;
if(deCit.empty())
{
rasp=deLucrat.front();
deLucrat.pop();
return rasp;
}
if(deLucrat.empty())
{
rasp=deCit.front();
deCit.pop();
return rasp;
}
if(deLucrat.front()<deCit.front())
{
rasp=deLucrat.front();
deLucrat.pop();
return rasp;
}
else
{
rasp=deCit.front();
deCit.pop();
return rasp;
}
}
int main()
{
long long rasp=0;
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
citire();
pair <long long,long long> min1;
pair <long long,long long> min2;
while(deCit.size()+deLucrat.size()>1)
{
min1=getMin();
min2=getMin();
deLucrat.push(make_pair(min1.first+min2.first,++n));
rasp+=min1.first+min2.first;
PARENT[(int)min1.second].indiceTata=PARENT[(int)min2.second].indiceTata=n;
PARENT[(int)min1.second].bit=0;
PARENT[(int)min2.second].bit=1;
}
printf("%lld\n",rasp);
for(int i=n-1; i>=1; i--)
{
PARENT[i].bit|=(1LL*(PARENT[PARENT[i].indiceTata].bit<<1));
dist[i]=1+dist[PARENT[i].indiceTata];
}
for(int i=1;i<=auxN;i++)
{
printf("%d %lld\n",dist[i],PARENT[i].bit);
}
return 0;
}