Submission #423102

#TimeUsernameProblemLanguageResultExecution timeMemory
423102ocarimaHoliday (IOI14_holiday)C++14
0 / 100
5082 ms6672 KiB
#include"holiday.h"
#include<bits/stdc++.h>

using namespace std;

#define debugsl(x) cout << #x << " = " << x << ", "
#define debug(x) debugsl(x) << "\n"

#define lli long long
#define rep(i, a, b) for(lli i = (a); i <= (b); ++i)

#define MAX_N 100003

#define atracciones first
#define pos second

#define activas first
#define suma second

int lugar[MAX_N], offset, tmp;
vector<pair<int, int> > sortedatt;
pair<lli, lli> st[1 << 18];
lli optr[MAX_N * 2], optl[MAX_N * 2], maxr[MAX_N * 2], maxl[MAX_N * 2], res, avl, avr;

lli queryst(int nodo, int k){
    if (!k) return 0;
    if (st[nodo].activas <= k) return st[nodo].suma;
    if (st[nodo * 2].activas > k) return queryst(nodo * 2, k);
    else return st[nodo * 2].suma + queryst(nodo * 2 + 1, k - st[nodo * 2].activas);
}

void updatest(int p){
    st[offset + p].activas = 1;
    st[offset + p].suma = sortedatt[p].atracciones;
    p += offset;

    while (p > 0){
        p >>= 1;
        st[p].activas = st[p * 2].activas + st[p * 2 + 1].activas;
        st[p].suma = st[p * 2].suma + st[p * 2 + 1].suma;
    }
}

void initst(){
    rep(i, 0, offset * 2 - 1) st[i] = {0,0};
}

long long int findMaxAttraction(int n, int start, int d, int attraction[]) {

    rep(i, 0, n - 1) sortedatt.emplace_back(attraction[i], i);
    sort(sortedatt.begin(), sortedatt.end());
    reverse(sortedatt.begin(), sortedatt.end());

    rep(i, 0, n - 1) lugar[sortedatt[i].pos] = i;

    offset = 1;
    while (offset < n) offset <<= 1;

    initst();
    rep(ciudad, 0, n - start + 1){
        updatest(lugar[start + ciudad]);
        rep(att, 1, min(ciudad + 1, (lli)d)){
            tmp = queryst(1, att);
            if (tmp > optr[ciudad + att]){
                optr[ciudad + att] = tmp;
                maxr[ciudad + att] = ciudad;
            }
        }
    }

    initst();
    rep(ciudad, 1, start){
        updatest(lugar[start - ciudad]);
        rep(att, 1, min(ciudad + 1, (lli)d)){
            tmp = queryst(1, att);
            if (tmp > optl[ciudad + att]){
                optl[ciudad + att] = tmp;
                maxl[ciudad + att] = ciudad;
            }
        }
    }

    res = 0;
    rep(i, 0, d){
        // si va primero a la izquierda
        avl = maxl[i] + i;
        if (avl <= d) res = max(res, optl[i] + optr[d - avl]);

        // si va primero a la derecha
        avr = maxr[i] + i;
        if (avr <= d) res = max(res, optr[i] + optl[d - avr]);
    }

    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...