Submission #1368902

#TimeUsernameProblemLanguageResultExecution timeMemory
1368902Ekber_EkberRice Hub (IOI11_ricehub)C++20
100 / 100
265 ms6296 KiB
#include "ricehub.h"
#include <bits/stdc++.h>
#define ff first
#define ss second
#define pb push_back
#define all(v) v.begin(), v.end()
#define int long long
using namespace std;

constexpr int MAX = 2e+5 + 1, INF = 2e+9, MOD = 1e+9 + 7, K = 31;

int32_t besthub(int32_t n, int32_t L, int32_t X[], long long b) {
    vector <int> v;
    for (int i = 0; i < n; i++) v.pb(X[i]);
    sort(all(v));
    int l = 1, r = n, res = 1;
    while (l <= r) {
        int mid = (l + r) / 2;
        multiset <int> le, ri;
        int sl = 0, sr = 0;
        auto add = [&](int x) {
            le.insert(x);
            sl += x;
            auto it = le.end();
            --it;
            ri.insert(*it);
            sr += *it;
            sl -= *it;
            le.erase(it);
            if (le.size() < ri.size()) {
                le.insert(*ri.begin());
                sl += *ri.begin();
                sr -= *ri.begin();
                ri.erase(ri.begin());
            }
        };
        auto med = [&]() -> int {
            return *le.rbegin();
        };
        auto rem = [&](int x) {
            if (x <= med()) {
                sl -= x;
                le.erase(le.find(x));
            }
            else {
                sr -= x;
                ri.erase(ri.find(x));
            }
            if (le.size() < ri.size()) {
                le.insert(*ri.begin());
                sl += *ri.begin();
                sr -= *ri.begin();
                ri.erase(ri.begin());
            }
            if (le.size() > ri.size() + 1) {
                auto it = le.end();
                --it;
                ri.insert(*it);
                sr += *it;
                sl -= *it;
                le.erase(it);
            }
        };
        auto cst = [&]() -> int {
            return sr - med() * ri.size() + med() * le.size() - sl;
        };
        for (int i = 0; i < mid; i++) {
            add(v[i]);
        }
        int mn = cst();
        for (int i = mid; i < n; i++) {
            add(v[i]);
            rem(v[i-mid]);
            mn = min(mn, cst());
        }
        if (mn <= b) {
            res = mid;
            l = mid + 1;
        }
        else r = mid - 1;
    }
    return res;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...