Cod sursa(job #2496240)

Utilizator radugnnGone Radu Mihnea radugnn Data 20 noiembrie 2019 15:59:29
Problema Coduri Huffman Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.6 kb
#include <bits/stdc++.h>
#define DIM 1000010
using namespace std;
ifstream fin ("huffman.in");
ofstream fout ("huffman.out");
struct {
    long long fiu_stanga=0;
    long long fiu_dreapta=0;
    long long val;
}v[2*DIM];
long long n,i,dim,j,total;
long long COD[DIM],LNG[DIM];
void dfs(int nod, long long cod, int lng){
    //cout<<nod<<" "<<cod<<"\n";
    if(nod<=n){
        COD[nod]=cod;
        LNG[nod]=lng;
        total+=lng*v[nod].val;
    }
    if(v[nod].val){
        dfs(v[nod].fiu_stanga, (cod<<1), lng+1);
        dfs(v[nod].fiu_dreapta, (cod<<1)+1, lng+1);
    }
}
int alege_minime(int i, int j){ ///scrisa urat
    if(j > dim)
        return 1;
    if(i > n)
        return 2;
    if(j<dim && i<n){
    if(v[i+1].val < v[j].val)
        return 1;
    else
        if(v[j+1].val < v[i].val)
            return 2;

        else{
            if(v[i].val > v[j].val)
                return 3;
            else
                return 4;
        }

    }
    else{
        if(j==dim){
            if(v[i+1].val < v[j].val){
                return 1;
            }
            else{
                if(v[i].val > v[j].val)
                    return 3;
                else
                    return 4;
            }
        }
        else{
            if(v[j+1].val < v[i].val){
                return 2;
            }
            else{
                if(v[i].val > v[j].val)
                    return 3;
                else
                    return 4;
            }
        }
    }
}
int main(){
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>v[i].val;
    dim=n;
    i=1;
    j=n+1;
    for(int alegeri=1;alegeri<n;alegeri++){
       int caz=alege_minime(i,j);
       dim++;
       if(caz==1){
        v[dim].val=v[i].val+v[i+1].val;
        v[dim].fiu_stanga=i;
        v[dim].fiu_dreapta=i+1;
        i+=2;
       }
       else
       if(caz==2){
        v[dim].val=v[j].val+v[j+1].val;
        v[dim].fiu_stanga=j;
        v[dim].fiu_dreapta=j+1;
        j+=2;
       }
       else
       if(caz==3){
        v[dim].val=v[i].val+v[j].val;
        v[dim].fiu_stanga=i;
        v[dim].fiu_dreapta=j;
        i++;
        j++;
       }
       else{
        v[dim].val=v[i].val+v[j].val;
        v[dim].fiu_stanga=j;
        v[dim].fiu_dreapta=i;
        i++;
        j++;
       }


    }
    int radacina=2*n-1;
    //for(i=1;i<=2*n-1;i++)
        //fout<<v[i].fiu_stanga<<" "<<v[i].fiu_dreapta<<"\n";
    dfs(radacina,0,0);
    fout<<total<<"\n";
    for(i=1;i<=n;i++)
        fout<<LNG[i]<<" "<<COD[i]<<"\n";
    return 0;
}