Pagini recente » Profil _Raoul_16 | Cod sursa (job #2125891) | Cod sursa (job #1714124) | Cod sursa (job #334784) | Cod sursa (job #2483150)
#include <fstream>
#include <vector>
#include <deque>
#define DIM 2000001
using namespace std;
ifstream fin ("huffman.in");
ofstream fout ("huffman.out");
long long val[DIM],cost;
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;
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
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();
}}
cost = x.first + y.first;
sol += cost;
L[i].push_back(x.second), L[i].push_back(y.second);
s2.push_back(make_pair(cost,i));
}
fout<<sol<<"\n";
dfs (2*n-1);
for (i=1;i<=n;i++)
fout<<lg[i]<<" "<<val[i]<<"\n";
return 0;
}