Cod sursa(job #1865691)

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

using namespace std;

const int Nmax = 1e6+5, buf_size = 1<<15;
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;
char buf[buf_size+5];

void read(int &n)
{
    n=0;
    while(!isdigit(buf[pos]))
    {
        ++pos;
        if(pos==buf_size) pos=0, fread(buf, 1, buf_size, stdin);
    }

    while(isdigit(buf[pos]))
    {
        n = n*10 + buf[pos] - '0';
        ++pos;
        if(pos==buf_size) pos=0, fread(buf, 1, buf_size, stdin);
    }
}

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);

    pos=0, fread(buf, 1, buf_size, stdin);
    read(n);
    for(i=1; i<=n; ++i)
    {
        read(p1);
        a[i] = (long long)p1;
    }

    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;
}