Cod sursa(job #2256728)

Utilizator b10nd3Oana Mancu b10nd3 Data 9 octombrie 2018 00:48:05
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include<iostream>
#include<fstream>
#include<queue>
 
using namespace std;
 
#define maxn 1000100
#define inf 1LL * 1000000000 * 1000000000
 
 /*
struct Node{
    long long value;
    long right,left;
};
typedef struct Node *tNode;
 
tNode nd[2*maxn];
*/
long dr[2*maxn],st[2*maxn];
long long value[2*maxn];
queue <int> q1,q2;
int n;
long long b10[maxn];
long lg[maxn]; 
ofstream out("huffman.out");
 
/* 
tNode createNode(long long val, long left, long right){
    tNode node=new Node();
    node->value=val;
    node->right=right;
    node->left=left;
    return node;
}
*/ 
 
long m(){
    long long value1=inf,value2=inf;
    long sol;
    if(q1.size()>0)
        value1=value[ q1.front()];
    if(q2.size()>0)
        value2=value[q2.front()];
    if(value1<value2){
        sol=q1.front();
        q1.pop();
    }   
    else{
        sol=q2.front();
        q2.pop();
    }
    return sol;
}
 
 
long buildTree(){
    ifstream in("huffman.in");
    int i,k;
    long long x,lg=0; 
    in>>n; 
     
    for(i=1;i<=n;i++) {
        in>>x;
        //nd[i]=createNode(x,0,0);
        value[i]=x;
		q1.push(i); 
    }  
    in.close();
     
    k=n;
    while(q1.size()>0 || q2.size()>1){  
       k++; 
       long l=m();
       long r=m();
       lg+=value[l]+value[r];
       //nd[k]=createNode(nd[left]->value+nd[right]->value,left,right);
       value[k]=value[l]+value[r]; dr[k]=r; st[k]=l;
	   q2.push(k);  
    }
    out<<lg<<'\n';
    return q2.back(); 
}
 
 
void readTree(long poz, long long cod, long nivel){
    if(st[poz]==0 && dr[poz]==0){
        lg[poz]=nivel;
        b10[poz]=cod;
    }
    if(st[poz]!=0)
        readTree(st[poz],cod*2,nivel+1);     
    if(dr[poz]!=0)
        readTree(dr[poz],cod*2+1,nivel+1);
}
 
 
int main(){
    readTree(buildTree(),0,0);  
    for(int i=1;i<=n;i++) 
       out<<lg[i]<<" "<<b10[i]<<'\n';    
    return 0;
}