Cod sursa(job #1865688)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 1 februarie 2017 22:54:57
Problema Coduri Huffman Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;

const int Nmax = 1e6+5;
const long long inf = 1LL<<60;

pair<int, int> v[2*Nmax];
long long a[2*Nmax], c[Nmax], sum=0;
int l[Nmax], p1, p2, n, nr, i, pos, L, R;

void take_two()
{
    long long val1, val2, val3;
    val1 = (p1<n ? a[p1]+a[p1+1] : inf);
    val2 = (p2<nr ? a[p2]+a[p2+1] : inf);
    val3 = (p1<=n && p2<=nr ? a[p1]+a[p2] : inf);

    if(val1<=val2 && val1<=val3)
    {
        a[++nr] = val1;
        v[nr] = {p1, p1+1};
        sum += a[nr];
        p1 += 2;
    }
    else if(val2<=val1 && val2<=val3)
    {
        a[++nr] = val2;
        v[nr] = {p2, p2+1};
        sum += a[nr];
        p2 += 2;
    }
    else
    {
        a[++nr] = val3;
        v[nr] = {p1, p2};
        sum += a[nr];
        ++p1, ++p2;
    }
}

int main()
{
    freopen("huffman.in", "r", stdin);
    freopen("huffman.out", "w", stdout);

    scanf("%d", &n);
    for(i=1; i<=n; ++i)
        scanf("%d", &a[i]);

    p1 = 1; p2 = n+1; nr = n;

    for(i=1; i<n; ++i) take_two();
    printf("%lld\n", sum);

    for(i=nr; i>n; --i)
    {
        L = v[i].first;
        R = v[i].second;
        l[L] = l[R] = l[i] + 1;
        c[L] = 2*c[i]; c[R] = 2*c[i]+1;
    }

    for(i=1; i<=n; ++i)
        printf("%d %lld\n", l[i], c[i]);

    return 0;
}