Cod sursa(job #968381)

Utilizator dropsdrop source drops Data 1 iulie 2013 23:44:05
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <bitset>
#include <queue>
#include <deque>
#include <list>
#include <set>
#include <ctime>
#include <string>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;
ifstream ff("huffman.in");
ofstream gg("huffman.out");
#define max 1000013

struct huf{ long long v, x; int k,l; struct huf *s,*d; 
	huf(long long v0=0,int k0=0){v=v0;k=k0;s=d=0;}
	huf(long long v0, huf *s0, huf *d0){v=v0;s=s0;d=d0;k=-1;} }*h,
	*qq[max];
int n, ll[max];
long long vv[max];

long long dfs(huf *r){
	huf *g;
	int p, u;
	long long t=0;
	r->l=0; r->x=0;
	qq[p=u=0]=r;
	while(p<=u){
		g=qq[p++];
		if(g->s==0 && g->d==0){
			vv[g->k]=g->x;
			ll[g->k]=g->l;
			t+=g->l*g->v;
		}
		if(g->s!=0){
			g->s->l=g->l+1;
			g->s->x=g->x*2;
			qq[++u]=g->s;
		}
		if(g->d!=0){
			g->d->l=g->l+1;
			g->d->x=g->x*2+1;
			qq[++u]=g->d;
		}
	}
	return t;
}

void arb(){
	huf *s,*d;
	int p, u, i;
	p=1; u=0; i=0;
	while((i<n || p<=u)){
		if(i==n || (p<=u && qq[p]->v<qq[i]->v))s=qq[p++]; else
			s=qq[i++];
		if(i==n || (p<=u && qq[p]->v<qq[i]->v))d=qq[p++]; else
			d=qq[i++];
			if(s==0||d==0){ break; }
			qq[++u]=new huf(s->v+d->v, s, d);
	}
	h=qq[u];
	gg << dfs(h) << "\n";
	for(int i=0;i<n;i++) gg << ll[i] << " " << vv[i] << "\n";
}

int main(){
	ff >> n;
	for(int i=0;i<n;i++){
		ff >> vv[i];
		qq[i]=new huf(vv[i],i);
	}
	arb();
}