Cod sursa(job #2640313)

Utilizator trifangrobertRobert Trifan trifangrobert Data 6 august 2020 00:24:37
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1000001;
int N;
int q1[NMAX], q2[NMAX];
int son[2][2 * NMAX];
int h[2 * NMAX];
long long v[2 * NMAX];

void dfs(int node, int father = 0)
{
    h[node] = h[father] + 1;
    if (son[0][node] != 0 && son[1][node] != 0)
    {
        v[son[0][node]] = 2LL * v[node];
        v[son[1][node]] = 2LL * v[node] + 1;
        dfs(son[0][node], node);
        dfs(son[1][node], node);
    }
}

int main()
{
    ifstream fin("huffman.in");
    ofstream fout("huffman.out");
    fin >> N;
    for (int i = 1;i <= N;++i)
    {
        fin >> v[i];
        q1[i] = i;
    }
    int pos = 1, left = 1, right = 0;
    int step = N, a, b;
    long long answer = 0;
    for (int i = 1;i < N;++i)
    {
        if (left > right || (pos <= N && v[q1[pos]] < v[q2[left]]))
            a = q1[pos++];
        else
            a = q2[left++];
        if (left > right || (pos <= N && v[q1[pos]] < v[q2[left]]))
            b = q1[pos++];
        else
            b = q2[left++];
        ++step;
        son[0][step] = a;
        son[1][step] = b;
        v[step] = v[a] + v[b];
        q2[++right] = step;
        answer += v[a] + v[b];
    }
    h[0] = -1;
    v[step] = 0;
    dfs(step);
    fout << answer << "\n";
    for (int i = 1;i <= N;++i)
        fout << h[i] << " " << v[i] << "\n";
    fin.close();
    fout.close();
    return 0;
}