Cod sursa(job #1442398)

Utilizator irimiecIrimie Catalin irimiec Data 25 mai 2015 11:48:06
Problema A+B Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <bits/stdc++.h>

using namespace std;

#define inf 0x0f0f0f

const int MAXN = 25010;
int n, L, val[MAXN];
//priority_queue<int, vector<int>, [](auto l, auto r) -> int { return val[l] < val[r]; }> H;
int H[2 * MAXN + 100], POZ[MAXN], V[MAXN], vec[MAXN];

inline int minim(int a, int b) { return (a < b) ? a : b; }

void insertAPM(int i) {
    for(int nod = 1; nod <= n; ++nod)
    if(i != nod) {
        V[nod] = minim(V[nod], val[nod] ^ val[i]);
        if(V[nod] == val[nod] ^ val[i])
            vec[nod] = i;
    }
}

void pushHeap(int poz)
{
    while((poz * 2 <= L && V[H[poz]] > V[H[poz * 2]]) || (poz * 2 + 1 <= L && V[H[poz]] > V[H[poz * 2 + 1]]))
    {
        if (V[H[poz * 2]] < V[H[poz * 2 + 1]] || poz * 2 + 1 > L)
        {
            swap(H[poz],H[poz * 2]);
            swap(POZ[H[poz]],POZ[H[poz * 2]]);
            poz *= 2;
        }
        else
        {
            swap(H[poz],H[poz * 2 + 1]);
            swap(POZ[H[poz]],POZ[H[poz * 2 + 1]]);
            poz = poz * 2 + 1;
        }
    }
}


void popHeap(int poz)
{
    while(poz > 1 && V[H[poz]] < V[H[poz / 2]])
    {
        swap(H[poz],H[poz / 2]);
        swap(POZ[H[poz]],POZ[H[poz / 2]]);
        poz = poz / 2;
    }
}

void insertHeap(int nod)
{
    H[++L] = nod;
    POZ[nod] = L;
    popHeap(L);
}

int topHeap()
{
    int x = H[1];
    swap(H[1],H[L]);
    swap(POZ[H[1]],POZ[H[L]]);
    L--;
    pushHeap(1);
        POZ[x] = 0;
    return x;
}

void solve() {
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &val[i]);

    L = 0;
    for(int i = 1; i <= n; ++i)
        V[i] = inf;
    V[1] = 0;
    insertAPM(1);

    for(int i = 2; i <= n; ++i)
        insertHeap(i);

    int ans = 0;
    for(int i = 1; i < n; ++i) {
        int x = topHeap();
        insertAPM(x);
        ans += V[x];
        for(int j = 1; j <= n; ++j)
            if(j != x)
                if(POZ[j])
                    popHeap(POZ[j]);
    }

    printf("%d\n", ans);
}

int main() {
    //freopen("yamstp.in", "r", stdin);
    //freopen("yamstp.out", "w", stdout);
    freopen("adunare.in", "r", stdin);
    freopen("adunare.out", "w", stdout);
    int t;
    scanf("%d", &t);
    int aa;
    scanf("%d", &aa);
    printf("%d", aa + t);
    return 0;
    while(t--) {
        solve();
    }
}