Cod sursa(job #2886680)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 8 aprilie 2022 01:10:37
Problema Coduri Huffman Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

typedef long long int lli;

const int MAXN = 1e6;

struct Node{
	lli v;
	int f[2];

	Node(lli v = 0) {
		this->v = v;
		f[0] = -1;
		f[1] = -1;
	}
};


int n, k;
Node nodes[2 * MAXN];
lli sol;
lli lg[MAXN + 2];
int cnt[MAXN + 2];

void dfs(int k, lli code, int lvl) {
	if (k < n) {
	lg[k] = code;
	cnt[k] = lvl;
	}

	for (int i = 0; i < 2; ++ i) {
		if (nodes[k].f[i] != -1)
			dfs(nodes[k].f[i], code * 2 + i, lvl + 1);
	}
}


int main() {
	freopen("huffman.in", "r", stdin);
	freopen("huffman.out", "w", stdout);

	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(false);

	cin >> n;

	for (int i = 0; i < n; ++ i) {
		int v;
		cin >> nodes[i].v;
	}

	int le = 0, ri = n;
	int st = n, dr = n;
	int k = n;
	while (le < ri || st + 1 < dr) {
		pair<lli, int> minn[2];

		for (int i = 0; i < 2; ++ i) {
			if (le >= ri) {
				minn[i] = {nodes[st].v, st ++};
			} else if (st >= dr) {
				minn[i] = {nodes[le].v, le ++};
			} else {
				minn[i] = nodes[le].v <= nodes[st].v ? make_pair(nodes[le].v, le) : make_pair(nodes[st].v, st);
				if (nodes[le].v <= nodes[st].v)
					++ le;
				else
					++ st;
			}
		}

		nodes[k ++].v = minn[0].first + minn[1].first;
		dr ++;

		sol += nodes[k - 1].v;

		for (int i = 0; i < 2; ++ i)
			nodes[k - 1].f[i] = minn[i].second;
	}

	dfs(k - 1, 0, 0);

	cout << sol << '\n';

	for (int i = 0; i < n; ++ i)
		cout << cnt[i] << ' ' << lg[i] << '\n';
	cout << '\n';

	return 0;
}