Submission #1302689

#TimeUsernameProblemLanguageResultExecution timeMemory
1302689kawhietNile (IOI24_nile)C++20
32 / 100
112 ms16468 KiB
#include <bits/stdc++.h>
#include "nile.h"
using namespace std;

vector<long long> calculate_costs(vector<int> w, vector<int> a, vector<int> b, vector<int> e) {
    int n = w.size();
    int q = e.size();
    vector<array<int, 2>> qs(q);
    for (int i = 0; i < q; i++) {
        qs[i] = {e[i], i};
    }
    vector<array<int, 3>> to_sort;
    for (int i = 0; i < n; i++) {
        to_sort.push_back({w[i], a[i], b[i]});
    }
    sort(to_sort.begin(), to_sort.end());
    for (int i = 0; i < n; i++) {
        w[i] = to_sort[i][0];
        a[i] = to_sort[i][1];
        b[i] = to_sort[i][2];
    }
    vector<array<int, 2>> diff;
    for (int i = 1; i < n; i++) {
        diff.push_back({w[i] - w[i - 1], i});
    }
    sort(diff.rbegin(), diff.rend());
    int j = 0, cur = n + (n & 1);
    sort(qs.rbegin(), qs.rend());
    vector<long long> ret(q);
    set<int> l, r;
    l.insert(0);
    r.insert(n - 1);
    for (auto [d, pos] : qs) {
        while (j < n - 1 && diff[j][0] > d) {
            int k = diff[j][1];
            auto tl = --l.upper_bound(k);
            auto tr = r.lower_bound(*tl);
            if ((*tr - *tl + 1) & 1) cur--;
            if ((k - *tl) & 1) cur++;
            if ((*tr - k + 1) & 1) cur++;
            l.insert(k);
            r.insert(k - 1);
            j++;
        }
        ret[pos] = cur;
    }
    return ret;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...