Pagini recente » Cod sursa (job #2333910) | Cod sursa (job #1041700) | Cod sursa (job #496320) | Cod sursa (job #3209489) | Cod sursa (job #2899037)
#include <bits/stdc++.h>
#define ll long long
#define Nmax 2000005
#define fr first
#define sc second
#define pii pair<int, int>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
int n, ap[Nmax];
ll sum;
queue <int> q1, q2;
vector <pii> v[Nmax];
vector <int> cod[Nmax];
int extrage()
{
int u;
if(q1.size()&&q2.size())
{
if(ap[q1.front()]<ap[q2.front()])
{
u=q1.front();
q1.pop();
}
else
{
u=q2.front();
q2.pop();
}
}
else if(q1.size()){
u=q1.front();
q1.pop();
}
else{
u=q2.front();
q2.pop();
}
return u;
}
void dfs(int x)
{
for(auto it:v[x])
{
cod[it.fr].push_back(it.sc);
for(auto aux:cod[x])
cod[it.fr].push_back(aux);
dfs(it.fr);
}
}
int main()
{
fin >> n;
for(int i=1;i<=n;i++)
{
fin >> ap[i];
q1.push(i);
}
for(int nod=n+1;nod<2*n;nod++)
{
int u1=extrage();
int u2=extrage();
ap[nod]=ap[u1]+ap[u2];
v[nod].push_back({u1, 1});
v[nod].push_back({u2, 0});
q2.push(nod);
}
dfs(n*2-1);
for(int i=1;i<=n;i++)
{
sum=sum+ap[i]*cod[i].size();
}
fout << sum << '\n';
for(int i=1;i<=n;i++)
{
fout << cod[i].size() << ' ';
ll value=0;
for(int j=0;j<cod[i].size();j++)
value = value + (1LL<<j)*cod[i][j];
fout << value << '\n';
}
return 0;
}