Cod sursa(job #2614047)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 11 mai 2020 09:22:05
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <queue>

using namespace std;

typedef long long lint;

struct Node{
	int ch[2];
	lint val;
};

ifstream fin("huffman.in");
ofstream fout("huffman.out");

int n;
Node nodes[2000041];

queue<int> inter;
void read(){
	fin >> n;
	for(int i = 1; i <= n; ++i){
		int a;fin >> nodes[i].val;
	}
}

lint ans1 = 0;
void solve(){
	int init = 1;
	for(int i = n+1; i <= 2*n-1; ++i){
		Node &node = nodes[i];
		for(int j = 0; j < 2; ++j){
			int ch;
			if(inter.empty() || (init <= n && nodes[init].val < nodes[inter.front()].val)){
				ch = init;
				init++;
			}else{
				ch = inter.front();
				inter.pop();
			}
			node.ch[j] = ch;
			node.val += nodes[ch].val;
		}
		ans1 += node.val;
		inter.push(i);
	}
}

typedef pair<int,lint> Ans2;
Ans2 ans2[1000041];

void dfs(int a=2*n-1, int len=0, lint code=0){
	Node &node = nodes[a];
	for(int i = 0; i < 2; ++i){
		int b = node.ch[i];
		int nlen = len+1;
		lint ncode = (code<<1) + i;
		if(b > n){
			dfs(b, nlen, ncode);
		}else{
			ans2[b] = {nlen, ncode};
		}
	}
}

void write(){
	fout << ans1 << "\n";
	dfs();
	for(int i = 1; i <= n; ++i){
		fout << ans2[i].first << " " << ans2[i].second << "\n";
	}
}

int main(){
	// ios_base::sync_with_stdio(false);
	read();
	solve();
	write();
	return 0;
}