Pagini recente » Cod sursa (job #838425) | Cod sursa (job #2328208) | Cod sursa (job #3205083) | Profil aIexpetrescu | Cod sursa (job #2199811)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream in ("huffman.in");
ofstream out ("huffman.out");
#define ll long long
int const nmax = 1000000;
struct Node{
int pos;
ll val;
};
queue < Node > q;
queue < Node > q2;
void qpop(){
if(q.size() == 0)
q2.pop();
else if(q2.size() == 0)
q.pop();
else if(q.front().val < q2.front().val)
q.pop();
else
q2.pop();
}
Node qfront(){
if(q.size() == 0)
return q2.front();
else if(q2.size() == 0)
return q.front();
else if(q.front().val < q2.front().val)
return q.front();
else
return q2.front();
}
int qsize(){
return q.size() + q2.size();
}
ll dp[5 + 2 * nmax];
int level[5 + nmax];
vector < int > g[5 + 2 * nmax];
void computedp(int node){
for(int h = 0 ; h < g[node].size() ;h++){
dp[g[node][h]] = dp[node] * 2 + h;
level[g[node][h]] = level[node] + 1;
computedp(g[node][h]);
}
}
ll cost[5 + nmax];
int main()
{
int n;
in >> n;
int originaln = n;
for(int i = 1 ; i <= n ;i++){
int a;
in >> a;
q.push({i , a});
cost[i] = a;
}
while(1 < qsize()){
Node a = qfront();
qpop();
Node b = qfront();
qpop();
Node c = {++n , a.val + b.val};
g[n].push_back(a.pos);
g[n].push_back(b.pos);
q2.push(c);
}
computedp(n);
ll result = 0;
for(int i = 1 ; i <= originaln ;i++){
result += level[i] *cost[i];
}
out << result << '\n';
for(int i = 1 ; i <= originaln ;i++){
out << level[i] << " " << dp[i] << '\n';
}
return 0;
}