Cod sursa(job #2886822)

Utilizator KataIsache Catalina Kata Data 8 aprilie 2022 13:41:30
Problema Coduri Huffman Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.72 kb
/*#include <fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");

struct lol{
    long long int copilmic;
    long long int copilmare;
    long long int val;
};

long long int codu[1000002];
int fr[1000002],adancimea[1000002];
vector <lol> G;
vector<long long int> fr2;
void bfs(int nod,  int adancime,long long int cod);
 int main()
{
    long long int n,i,lungime=0,k,j,maimic,indicemic,maimare,indicemare,el1,el2,radacina;
    fin>>n;
    lol x;
    for(i=0; i<n;i++)
        {
            fin>>fr[i];
            x.val=fr[i];
            x.copilmic=-1;
            x.copilmare=-1;
            G.push_back(x);
        }
    j=0;
    k=0;
    while(j<n || k<fr2.size())
    {
        el1=-1,el2=-1;
        if(j<n) el1=fr[j];
        if(k<fr2.size()) el2=fr2[k];
        if(el1!=-1 && (el1<=el2 || el2==-1)){
            maimic=el1;
            indicemic=j;
            j++;
        }
        else if(el2!=-1 && (el1>el2 || el1==-1)){
            maimic=el2;
            indicemic=n+k;
            k++;
        }

        el1=-1,el2=-1;
        if(j<n) el1=fr[j];
        if(k<fr2.size()) el2=fr2[k];
         if(el1!=-1 && (el1<=el2 || el2==-1)){
            maimare=el1;
            indicemare=j;
            j++;
        }
        else if(el2!=-1 && (el1>el2 || el1==-1)){
            maimare=el2;
            indicemare=n+k;
            k++;
        }
        if(el1==-1 && el2==-1) {
                radacina=indicemic;
                break;
        }
        lol nod_nou;
        nod_nou.val=maimic+maimare;
        nod_nou.copilmic=indicemic;
        nod_nou.copilmare=indicemare;

        G.push_back(nod_nou);
        fr2.push_back(nod_nou.val);
        lungime+=nod_nou.val;
    }
    fout<<lungime<<'\n';
    bfs(radacina,0,0);
    for(i=0;i<n;i++)
        fout<<adancimea[i]<<" "<<codu[i]<<'\n';
    return 0;
}

void bfs(int nod,  int adancime,long long int cod){
    queue <pair<int, pair<int, long long int>  >>q;
    q.push({nod,{ adancime, cod}});
    while(!q.empty()){
        nod=q.front().first;
        adancime=q.front().second.first;
        cod=q.front().second.second;
        q.pop();
        if(G[nod].copilmic==-1) //nod final
            {
                adancimea[nod]=adancime;
                codu[nod]=cod;
                return;
            }

        q.push({G[nod].copilmare,{ adancime+1, cod*2+1}});
        q.push({G[nod].copilmic,{ adancime+1, cod*2}});
    }
}*/
#include <fstream>
#include<vector>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");

struct lol{
     int copilmic;
     int copilmare;
    long long int val;
};

int fr[1000002], adancimea[1000002];
long long codu[1000002];
vector <lol> G;
vector<long long int> fr2;
void bfs(int nod, int adancime,long long int cod);

int main()
{
    long long int n,i,lungime=0,k,j,maimic,indicemic,maimare,indicemare,el1,el2,radacina;
    fin>>n;
    lol x;
    for(i=0; i<n;i++)
        {
            fin>>fr[i];
            x.val=fr[i];
            x.copilmic=-1;
            x.copilmare=-1;
            G.push_back(x);
        }
    j=0;
    k=0;
    while(j<n || k<fr2.size())
    {
        el1=-1,el2=-1;
        if(j<n) el1=fr[j];
        if(k<fr2.size()) el2=fr2[k];
        if(el1!=-1 && (el1<=el2 || el2==-1)){
            maimic=el1;
            indicemic=j;
            j++;
        }
        else if(el2!=-1 && (el1>el2 || el1==-1)){
            maimic=el2;
            indicemic=n+k;
            k++;
        }

        el1=-1,el2=-1;
        if(j<n) el1=fr[j];
        if(k<fr2.size()) el2=fr2[k];
         if(el1!=-1 && (el1<=el2 || el2==-1)){
            maimare=el1;
            indicemare=j;
            j++;
        }
        else if(el2!=-1 && (el1>el2 || el1==-1)){
            maimare=el2;
            indicemare=n+k;
            k++;
        }
        if(el1==-1 && el2==-1) {
                radacina=indicemic;
                break;
        }
        lol nod_nou;
        nod_nou.val=maimic+maimare;
        nod_nou.copilmic=indicemic;
        nod_nou.copilmare=indicemare;

        G.push_back(nod_nou);
        fr2.push_back(nod_nou.val);
        lungime+=nod_nou.val;
    }
    fout<<lungime<<'\n';
    bfs(radacina,0,0);
    for(i=0;i<n;i++)
        fout<<adancimea[i]<<" "<<codu[i]<<'\n';
    return 0;
}

void bfs(int nod,  int adancime,long long int cod){
    if(G[nod].copilmic==-1) //nod final
        {
            adancimea[nod]=adancime;
            codu[nod]=cod;
            return;
        }

        bfs(G[nod].copilmare, adancime+1, cod*2+1);
        bfs(G[nod].copilmic, adancime+1, cod*2);

}