Pagini recente » Cod sursa (job #927790) | Cod sursa (job #1989425) | Cod sursa (job #2814362) | Cod sursa (job #1516942) | Cod sursa (job #1081147)
//
// main.cpp
// huffman+
//
// Created by Catalina Brinza on 1/11/14.
// Copyright (c) 2014 Catalina Brinza. All rights reserved.
//
#include <stdio.h>
#include <vector>
#define nru 1000000
using namespace std;
struct nod
{
int val;
int cop[2];
};
nod a[2*nru];
int n;
vector <int, int> vec;
int niv[nru];
long long cod[nru],s=0;
void parcurgere(int k,long long binar, int nivel)
{
if (a[k].cop[0]!=0)
{
parcurgere(a[k].cop[0],binar*2,nivel+1);
parcurgere(a[k].cop[1],binar*2+1,nivel+1);
}
niv[k]=nivel;
cod[k]=binar;
s+=nivel*a[k].val;
return;
}
void urcare(int k)
{
while (vec[k].first<vec[k/2].first && k>1)
{
swap(vec[k],vec[k/2]);
k=k/2;
}
return;
}
void coborare(int k)
{
while (k*2+1<vec.size() && (vec[k].first>vec[k*2].first || vec[k].first>vec[k*2+1].first))
{
if (vec[k*2+1].first<vec[k*2].first)
{
swap(vec[k],vec[k*2+1]);
k=k*2+1;
}
else
{
swap(vec[k],vec[k*2])
k=k*2;
}
}
if (k*2==vec.size()-1 && vec[k*2].first<vec[k].first) swap(vec[k],vec[k*2]);
return;
}
void prostie()
{int m,i;
pair <int,int > aux;
m=n;
while (vec.size()!=2)
{
++m;
for (i=0;i<2;++i)
{
aux.first=vec[1].first;
aux.second=vec[1].second;
swap(vec[1],vec[vec.size()-1]);
vec.pop_back();
coborare(1);
a[m].cop[i]=aux.second;
a[m].val+=aux.first;
}
vec.push_back(make_pair(a[m].val,m));
swap(vec[1],vec[vec.size()-1]);
vec.pop_back();
coborare(1);
}
parcurgere(m,0,0);
return;
}
int main()
{int i,k;
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
scanf("%d", &n);
vec.push_back(make_pair(0,0));
for (i=1;i<=n;++i)
{
scanf("%d",&a[i].val);
vec.push_back(make_pair(a[i].val,i));
k=vec.size()-1;
urcare(k);
}
prostie();
printf("%lld\n", s);
for (i=1;i<=n;++i)
{
printf("%d %lld\n",niv[i],cod[i]);
}
return 0;
}