Pagini recente » Cod sursa (job #929928) | Cod sursa (job #1037004) | Cod sursa (job #2444224) | Cod sursa (job #415113) | Cod sursa (job #2791843)
#include <bits/stdc++.h>
#define N NULL
#define ll long long
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
const int NMAX = 1e6+6;
struct nod
{
ll val;
int poz;
nod *left_son, *right_son;
nod(ll _val, nod *_left_son, nod *_right_son, int _poz = -1)
{
val = _val;
left_son = _left_son;
right_son = _right_son;
poz = _poz;
}
nod()
{
}
};
///w - heap ul pe care il voi modifica
///init - nodurile initiale (caracterele de la care plec)
vector <nod> w;
bool cmp(nod a, nod b)
{
return a.val > b.val;
}
struct sol
{
ll adancime, dec;
};
sol rasp[NMAX];
ll lg;
///0 pe stanga si 1 pe dreapta
void parc(nod *node, ll ad, ll val)
{
lg += node -> val;
//fout << node->val << ' ';
///daca e o frunza
if(node -> poz != -1)
lg -= node -> val, rasp[node->poz].adancime = ad, rasp[node->poz].dec = val;
if(node -> left_son != N)
parc(node->left_son, ad+1, (val)<<1);
if(node -> right_son != N)
parc(node->right_son, ad+1, (val+1)<<1);
// fout << node -> val << ' ';
// if(node -> left_son != N)
// fout << node -> left_son -> val << ' ';
//
// if(node -> right_son != N)
// fout << node -> right_son -> val << ' ';
// fout << '\n';
// if(node -> left_son != N)
// parc(node -> left_son, ad+1, val+1);
//
// if(node -> right_son != N)
// parc(node -> right_son, ad+1, val+1);
}
int main()
{
int n, i;
ll val;
fin >> n;
for(i = 1; i <= n; ++i)
{
fin >> val;
w.push_back(nod(val, N, N, i));
}
make_heap(w.begin(), w.end(), cmp);
// for(vector<nod>::iterator it = w.begin(); it != w.end(); ++it)
// fout << it -> val << ' ';
nod *first, *second, *root;
while(w.size() > 1)
{
first = new nod;
second = new nod;
*first = w[0];
pop_heap(w.begin(), w.end(), cmp);
w.pop_back();
*second = w[0];
pop_heap(w.begin(), w.end(), cmp);
w.pop_back();
w.push_back(nod(first->val + second->val, first, second));
push_heap(w.begin(), w.end(), cmp);
}
root = new nod;
*root = w[0];
w.pop_back();
parc(root, 0ll, 0ll);
// ll lg = 0;
//
// for(i = 1; i <= n; ++i)
// lg += rasp[i].adancime * init[i].val;
fout << lg << '\n';
for(i = 1; i <= n; ++i)
fout << rasp[i].adancime << ' ' << rasp[i].dec << '\n';
return 0;
}