Submission #1216898

#TimeUsernameProblemLanguageResultExecution timeMemory
1216898mariamp1Rice Hub (IOI11_ricehub)C++20
0 / 100
0 ms320 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

const int MAX_R = 1000005;
long long P[MAX_R];

bool can(int k, int n, const vector<int>& X, long long bgt) {
    if (k == 0) return true;
    if (k > n) return false;

    for (int i = 0; i <= n - k; ++i) {
        int lidx = i;
        int ridx = i + k - 1;
        int midx = lidx + k / 2;
        long long cost = 0;
        long long nleft = midx - lidx;
        long long sleft = P[midx] - P[lidx];
        cost += nleft * X[midx] - sleft;

        long long nright = ridx - midx;
        long long sright = P[ridx + 1] - P[midx + 1];
        cost += sright - nright * X[midx];
        if (cost <= bgt) {
            return true;
        }
    }
    return false;
}

int besthub(int n, int min_k, int x_coords[], long long bgt) {
    vector<int> X(x_coords, x_coords + n);
    sort(X.begin(), X.end());
    P[0] = 0;
    for (int i = 0; i < n; ++i) {
        P[i+1] = P[i] + X[i];
    }

    int lo = min_k;
    int hi = n;
    int res = 0;
    while (lo <= hi) {
        int md = lo + (hi - lo) / 2;

        if (can(md, n, X, bgt)) {
            res = md;
            lo = md + 1;
        } else {
            hi = md - 1;
        }
    }

    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...