Cod sursa(job #3149803)

Utilizator proflaurianPanaete Adrian proflaurian Data 12 septembrie 2023 18:55:51
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("huffman.in");
ofstream g("huffman.out");
typedef int64_t Int;
const Int oo=1000000000000000010LL;
const int N = 2000002;
int n,F[2][N],lg[N],t,f11,f12,f21,f22;
Int v[N],sol,C[N],val11,val12,val21,val22,val;
pair<Int,int> s[4];
bitset<N> used;
int main()
{
    f>>n;
    for(int i=1; i<=n; i++)
        f>>v[i];
    f11=1;
    f12=2;
    f21=n+1;
    f22=n+2;
    t=n+1;
    while(t<2*n)
    {
        /// fac un vector cu valorile din pozitiile posibile
        val11=f11<=n?v[f11]:oo;
        s[0]=make_pair(val11,f11);
        val12=f12<=n?v[f12]:oo;
        s[1]=make_pair(val12,f12);
        val21=f21<t?v[f21]:oo;
        s[2]=make_pair(val21,f21);
        val22=f22<t?v[f22]:oo;
        s[3]=make_pair(val22,f22);
        /// sortez dupa valori
        sort(s,s+4);
        /// aleg cele mai mici doua valori si vizitez pozitiile lor
        /// distribui pozitiile ca fii pentru tata si vizitez
        tie(val,F[0][t])=s[0];
        used[F[0][t]]=1;
        v[t]+=val;
        tie(val,F[1][t])=s[1];
        used[F[1][t]]=1;
        v[t]+=val;
        sol+=v[t];
        /// reasez pozitiile posibile
        while(used[f11])f11++;
        f12=f11+1;
        while(used[f21])f21++;
        f22=f21+1;
        /// merg mai departe
        t++;
    }
    g<<sol<<'\n';
    for(int i=2*n-1;i>=2;i--)
    {
        int st=F[0][i],dr=F[1][i];
        C[st]=2*C[i];
        C[dr]=2*C[i]+1;
        lg[st]=lg[dr]=lg[i]+1;
    }
    for(int i=1;i<=n;i++)
        g<<lg[i]<<' '<<C[i]<<'\n';
}