Submission #1318530

#TimeUsernameProblemLanguageResultExecution timeMemory
1318530MisterReaperHoliday (IOI14_holiday)C++20
100 / 100
960 ms5856 KiB
#include "holiday.h"
#include "bits/stdc++.h"

using i64 = long long;

#ifdef DEBUG 
    #include "/home/ahmetalp/Desktop/Workplace/debug.h"
#else
    #define debug(...) void(23)
#endif

namespace {

int N;
int start;
int D;
std::vector<int> A;

int dist(int l, int r) {
    if (r < start) {
        return start - l;
    } else if (l <= start && start <= r) {
        return r - l + std::min(start - l, r - start);
    } else {
        return r - start;
    }
} 

i64 sum = 0;
std::multiset<i64> pql;
std::multiset<i64, std::greater<i64>> pqr;
i64 balance(int x) {
    x = std::max(0, x);
    while (!pqr.empty() && !pql.empty() && *pqr.begin() > *pql.begin()) {
        sum -= *pql.begin();
        pqr.emplace(*pql.begin());
        sum += *pqr.begin();
        pql.emplace(*pqr.begin());
        pql.erase(pql.begin());
        pqr.erase(pqr.begin());
    }
    while (int(pql.size()) > x) {
        sum -= *pql.begin();
        pqr.emplace(*pql.begin());
        pql.erase(pql.begin());
    }
    while (int(pql.size()) < x && !pqr.empty()) {
        sum += *pqr.begin();
        pql.emplace(*pqr.begin());
        pqr.erase(pqr.begin());
    }
    return sum;
};

int l = 0, r = -1;
i64 fit(int L, int R) {
    while (r < R) {
        pqr.emplace(A[++r]);
    }
    while (l > L) {
        pqr.emplace(A[--l]);
    }
    while (l < L) {
        if (pql.find(A[l]) != pql.end()) {
            sum -= A[l];
            pql.erase(pql.find(A[l]));
        } else {
            pqr.erase(pqr.find(A[l]));
        }
        l++;
    }
    while (r > R) {
        if (pql.find(A[r]) != pql.end()) {
            sum -= A[r];
            pql.erase(pql.find(A[r]));
        } else {
            pqr.erase(pqr.find(A[r]));
        }
        r--;
    }
    return balance(D - dist(l, r));
}

i64 ans = 0;

void dnq(int l, int r, int optl, int optr) {
    if (l > r) {
        return;
    }
    int mid = (l + r) >> 1;
    std::pair<i64, int> res = {0, optl};
    for (int i = optl; i <= std::min(optr, mid); ++i) {
        res = std::max(res, std::pair<i64, int>{fit(i, mid), i});
    }
    ans = std::max(ans, res.first);
    dnq(l, mid - 1, optl, res.second);
    dnq(mid + 1, r, res.second, optr);
};

};


i64 findMaxAttraction(int n, int start, int d, int attraction[]) {
    N = n;
    ::start = start;
    D = d;
    A.resize(N);
    for (int i = 0; i < N; ++i) {
        A[i] = attraction[i];
    }

    dnq(0, n - 1, 0, n - 1);

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