Pagini recente » Cod sursa (job #2807627) | Cod sursa (job #1749515) | Cod sursa (job #602682) | Cod sursa (job #2066723) | Cod sursa (job #2483167)
#include <fstream>
#include <vector>
#include <deque>
#define DIM 1000001
using namespace std;
ifstream fin ("huffman.in");
ofstream fout ("huffman.out");
long long val[DIM];
int lg[DIM];
int n,i,cost;
deque < pair<long long,int> > s1,s2;
pair <int,int> L[DIM*2];
void dfs (int nod, int lg_nod, long long val_nod){
if (!L[nod].first) /// nu am fii
return;
int fiu_st = L[nod].first, fiu_dr = L[nod].second;
if (fiu_st <= n){
lg[fiu_st] = 1 + lg_nod;
val[fiu_st] = (val_nod<<1);
}
if (fiu_dr <= n){
lg[fiu_dr] = 1 + lg_nod;
val[fiu_dr] = (val_nod<<1) + 1;
}
dfs (fiu_st,1+lg_nod,(val_nod<<1));
dfs (fiu_dr,1+lg_nod,(val_nod<<1)+1);
}
int main (){
fin>>n;
for (i=1;i<=n;i++){
fin>>cost;
s1.push_back(make_pair(cost,i));
}
/// construiesc un arbore binar cu 2*n-1 noduri
/// tin doua stive pt ca trb sa extrag cele mai mici doua minime
long long sol = 0;
for (i=n+1;i<=2*n-1;i++){
/// vreau cele mai mici doua elemente
pair <long long,int> x,y;
/// iau doua elemente din prima coada, doua din a doua, sau unul din una si unul din alta
/// aleg primul element
if (s1.size() && s2.size()){
if (s1.front().first <= s2.front().first){
x = s1.front();
s1.pop_front();
} else {
x = s2.front();
s2.pop_front();
}
} else {
if (s1.size()){
x = s1.front();
s1.pop_front();
} else {
x = s2.front();
s2.pop_front();
}}
/// acum fac acelasi lucru pt al doilea
if (s1.size() && s2.size()){
if (s1.front().first <= s2.front().first){
y = s1.front();
s1.pop_front();
} else {
y = s2.front();
s2.pop_front();
}
} else {
if (s1.size()){
y = s1.front();
s1.pop_front();
} else {
y = s2.front();
s2.pop_front();
}}
long long cost = x.first + y.first;
sol += cost;
L[i] = make_pair(x.second,y.second);
s2.push_back(make_pair(cost,i));
}
fout<<sol<<"\n";
dfs (2*n-1,0,0);
for (i=1;i<=n;i++)
fout<<lg[i]<<" "<<val[i]<<"\n";
return 0;
}