Pagini recente » Cod sursa (job #791628) | Cod sursa (job #340614) | Cod sursa (job #2553518) | Cod sursa (job #3330540) | Cod sursa (job #3304012)
#include <fstream>
#include <vector>
#include <set>
using namespace std;
#define int long long
struct node
{
int st, dr, sum;
};
ifstream in("huffman.in");
ofstream out("huffman.out");
int n, cnt, ans;
node v[2000005];
multiset<pair<int, int>> s;
pair<int, int> rez[1000005];
void dfs(int node, int cod, int len)
{
if(v[node].st == 0)
{
rez[node] = {len, cod};
return;
}
ans += v[node].sum;
dfs(v[node].st, 2 * cod, len + 1);
dfs(v[node].dr, 2 * cod + 1, len + 1);
}
signed main()
{
in>>n;
int x;
for(int i = 1; i<=n; i++)
{
in>>x;
s.insert({x, i});
}
cnt = n;
while(s.size() >= 2)
{
pair<int, int> a = (*s.begin());
s.erase(s.begin());
pair<int, int> b = (*s.begin());
s.erase(s.begin());
cnt++;
v[cnt].st = a.second;
v[cnt].dr = b.second;
v[cnt].sum = a.first + b.first;
s.insert({v[cnt].sum, cnt});
}
dfs(cnt, 0, 0);
out<<ans<<'\n';
for(int i = 1; i<=n; i++)
{
out<<rez[i].first<<" "<<rez[i].second<<'\n';
}
return 0;
}