Pagini recente » Cod sursa (job #2332356) | Monitorul de evaluare | Cod sursa (job #308846) | Cod sursa (job #1574484) | Cod sursa (job #1992866)
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
queue <pair<long long,int> > deCit;
queue <pair<long long,int> > deLucrat;
int n,auxN;
struct node
{
int indiceTata;
int bit;
}PARENT[2000003];
void citire()
{
long long aux;
scanf("%d",&n);
auxN=n;
for(int i=1; i<=n; i++)
{
scanf("%lld",&aux);
deCit.push(make_pair(aux,i));
}
}
pair<long long,int> getMin()
{
pair<long long,int> rasp;
if(!deCit.empty())
{
if(!deLucrat.empty())
{
if(deCit.front().first<=deLucrat.front().first)
{
rasp=deCit.front();
deCit.pop();
return rasp;
}
else
{
rasp=deLucrat.front();
deLucrat.pop();
return rasp;
}
}
else
{
rasp=deCit.front();
deCit.pop();
return rasp;
}
}
else if(!deLucrat.empty())
{
rasp=deLucrat.front();
deLucrat.pop();
return rasp;
}
}
int main()
{
long long rasp=0;
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
citire();
pair <long long,int> min1;
pair <long long,int> 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[min1.second].indiceTata=PARENT[min2.second].indiceTata=n;
PARENT[min1.second].bit=0;
PARENT[min2.second].bit=1;
}
printf("%lld\n",rasp);
for(int i=1;i<=auxN;i++)
{
int poz=i;
long long nrCod=0;
int p=0;
while(poz!=n)
{
nrCod+=PARENT[poz].bit<<p;
poz=PARENT[poz].indiceTata;
p++;
}
printf("%d %lld\n",p,nrCod);
}
return 0;
}