Pagini recente » Cod sursa (job #840404) | Cod sursa (job #60011) | Cod sursa (job #2659557) | Cod sursa (job #569505) | Cod sursa (job #2618038)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000005;
#define lg first
#define bin second
int v[MAXN];
pair<int, long long> cod[MAXN];
queue<long long> init, intern;
vector<int> graf[2 * MAXN];
long long ans = 0;
int root, pnrm, pint;
long long getmin(bool &isint){
long long best = 1e18;
if(!init.empty()) best = init.front();
if(!intern.empty() && best > intern.front()) best = intern.front();
if(best == init.front()){
pnrm++;
init.pop();
}
else{
isint = 1;
pint++;
ans += intern.front();
intern.pop();
}
return best;
}
void dfs(int crt, int cif){
int bit = 0;
for(auto x: graf[crt]){
cod[x].lg = cif + 1;
cod[x].bin = cod[crt].bin * 2 + bit;
dfs(x, cif + 1);
bit = 1 - bit;
}
}
int main()
{
ifstream fin("huffman.in");
ofstream fout("huffman.out");
int n, root;
fin >> n;
for(int i = 1; i <= n; ++i){
fin >> v[i];
init.push(v[i]);
}
pnrm = 0; pint = root = n;
while(!init.empty() || intern.size() != 1){
bool isx = 0, isy = 0;
long long x = getmin(isx), y = getmin(isy);
intern.push(x + y);
root++;
if(!isx && !isy){
graf[root].push_back(pnrm - 1);
graf[root].push_back(pnrm);
}
else if(isx && isy){
graf[root].push_back(pint - 1);
graf[root].push_back(pint);
}
else{
graf[root].push_back(pnrm);
graf[root].push_back(pint);
}
}
ans += intern.front();
fout << ans << "\n";
dfs(root, 0);
for(int i = 1; i <= n; ++i) fout << cod[i].lg << " " << cod[i].bin << "\n";
return 0;
}