Pagini recente » Cod sursa (job #1538174) | Cod sursa (job #1164800) | Istoria paginii runda/oji20092010 | Cod sursa (job #2759144) | Cod sursa (job #2483023)
#include <fstream>
#include <vector>
#include <deque>
#define DIM 2000000
using namespace std;
ifstream fin ("huffman.in");
ofstream fout ("huffman.out");
long long val[DIM],cost[DIM];
long long sol;
int n,i;
int lg[DIM];
deque < pair<long long,int> > s1,s2;
vector <int> L[DIM];
void dfs (int nod){
if (L[nod].empty())
return;
int fiu_st = L[nod][0], fiu_dr = L[nod][1];
lg[fiu_st] = 1 + lg[nod];
lg[fiu_dr] = 1 + lg[nod];
val[fiu_st] = (val[nod]<<1);
val[fiu_dr] = (val[nod]<<1) + 1;
dfs (fiu_st);
dfs (fiu_dr);
}
int main (){
fin>>n;
for (i=1;i<=n;i++){
fin>>cost[i];
s1.push_back(make_pair(cost[i],i));
}
/// construiesc un arbore binar cu 2*n-1 noduri
/// tin doua stive pt ca trb sa extrag cele mai mici doua minime
for (i=n+1;i<=2*n-1;i++){
/// vreau cele mai mici doua elemente
pair <int,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();
}}
cost[i] = x.first + y.first;
sol += cost[i];
L[i].push_back(x.second), L[i].push_back(y.second);
s2.push_back(make_pair(cost[i],i));
}
fout<<sol<<"\n";
dfs (2*n-1);
for (i=1;i<=n;i++)
fout<<lg[i]<<" "<<val[i]<<"\n";
return 0;
}