Cod sursa(job #383871)

Utilizator katakunaCazacu Alexandru katakuna Data 18 ianuarie 2010 16:00:08
Problema Coduri Huffman Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <cstdio>
#include <vector>
using namespace std;

#define Nmax 1000010

struct nod {
	long long f; 
	int st, dr;
} H[Nmax * 2];

int n, i, j, m, lg;
int LG[Nmax];
int v[Nmax], Q[Nmax], B[Nmax];

void dfs (int nod, int lg, int b) {
	
	if (H[nod].f) {LG[nod] = lg; B[nod] = b; return ;}
	dfs (H[nod].st, lg + 1, b << 1);
	dfs (H[nod].dr, lg + 1, (b << 1) + 1);
}

void rezolva () {
	
	for (i = 1, j = 1; i <= n || j <= m; )
		if ( i <= n && ( j > m || v[i] <= Q[j])) {
			i++; if (i > n && j > m) break;
			
			if ( i <= n && ( j > m || v[i] <= Q[j])) {
				Q[++m] = v[i-1] + v[i];
				H[m + n].st = i-1; H[m + n].dr = i; H[m + n].f = 0; 
				i++; lg+= Q[m];
			}
			
			else {
				Q[++m] = v[i-1] + Q[j];
				H[m + n].st = i-1; H[m + n].dr = j + n; H[m + n].f = 0;
				j++; lg+= Q[m];
			}
		}
		
		else {
			j++; if (i > n && j > m) break;
			if ( i <= n && ( j > m || v[i] <= Q[j])) {
				Q[++m] = Q[j-1] + v[i];
				H[m + n].st = j - 1 + n; H[m + n].dr = i; H[m + n].f = 0;
				i++; lg+= Q[m];
			}
			
			else {
				Q[++m] = Q[j-1] + Q[j];
				H[m + n].st = j - 1 + n; H[m + n].dr = j + n; H[m + n].f = 0;
				j++; lg+= Q[m];
			}
		}
	
	dfs (n + m, 0, 0);
}

int main () {

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

	scanf ("%d", &n);
	for (i = 1; i <= n; i++) {
		scanf ("%d", &v[i]);
		H[i].f = v[i];
	}
	
	rezolva ();
	
	printf ("%d\n", lg);
	for (i = 1; i <= n; i++) 
		printf ("%d %d\n", LG[i], B[i]);
	
	return 0;
}