Cod sursa(job #3261307)

Utilizator hhhhhhhAndrei Boaca hhhhhhh Data 5 decembrie 2024 13:38:40
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
typedef long long ll;
ll ans,sol[1000005],lg[1000005];
int n;
struct node
{
	ll val;
	int lft,rgt;
};
vector<node> t; 
queue<int> q1,q2;
int nodes;
int getmin()
{
	if(q1.empty())
	{
		int rez=q2.front();
		q2.pop();
		return rez;
	}
	if(q2.empty())
	{
		int rez=q1.front();
		q1.pop();
		return rez;
	}
	int a=q1.front();
	int b=q2.front();
	if(t[a].val<t[b].val)
	{
		q1.pop();
		return a;
	}
	q2.pop();
	return b;
}
void dfs(int nod,ll l,ll val)
{
	if(nod<n)
	{
		sol[nod]=val;
		lg[nod]=l;
		return;
	}
	if(t[nod].lft!=-1)
		dfs(t[nod].lft,l+1,val*2LL);
	if(t[nod].rgt!=-1)
		dfs(t[nod].rgt,l+1,val*2LL+1);
}
int main()
{
	ios_base::sync_with_stdio(false);
	fin.tie(0);
	fin>>n;
	for(int i=1;i<=n;i++)
	{
		int x;
		fin>>x;
		node me;
		me.val=x;
		me.lft=-1;
		me.rgt=-1;
		t.push_back(me);
		q1.push(i-1);
	}
	nodes=n;
	while((int)q1.size()+(int)q2.size()>1)
	{
		int a=getmin();
		int b=getmin();
		node me;
		me.val=t[a].val+t[b].val;
		ans+=me.val;
		me.lft=a;
		me.rgt=b;
		nodes++;
		t.push_back(me);
		q2.push(nodes-1);
	}
	fout<<ans<<'\n';
	dfs(nodes-1,0,0);
	for(int i=0;i<n;i++)
		fout<<lg[i]<<' '<<sol[i]<<'\n';
	return 0;
}