Submission #1143885

#TimeUsernameProblemLanguageResultExecution timeMemory
1143885mattsohPilot (NOI19_pilot)C++20
89 / 100
114 ms6400 KiB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
typedef long long ll;

const ll maxn = 1e5 + 10;
pair<ll, ll> h[maxn];
vector<pair<ll, ll>> p(maxn);
set<pair<ll, ll>> rgs;
ll totalSum = 0;

void rem(ll idx) {
    auto it = rgs.lower_bound({idx, idx});
    if (it == rgs.end() || it->fi > idx) --it;

    pair<ll, ll> range = *it;
    rgs.erase(it);

    ll len = range.se - range.fi + 1;
    totalSum -= len * (len + 1) / 2;

    if (range.fi < idx) {
        ll leftLen = idx - range.fi;
        totalSum += leftLen * (leftLen + 1) / 2;
        rgs.insert({range.fi, idx - 1});
    }
    if (idx < range.se) {
        ll rightLen = range.se - idx;
        totalSum += rightLen * (rightLen + 1) / 2;
        rgs.insert({idx + 1, range.se});
    }
}

bool cmpp(pair<ll, ll> t1, pair<ll, ll> t2) {
    if (t1.fi != t2.fi) return t1.fi > t2.fi;
    else return t1.se < t2.se;
}

signed main() {
    cin.tie(0);
    cout.tie(0);
    ios_base::sync_with_stdio(false);

    ll n, q;
    cin >> n >> q;

    for (ll i = 0; i < n; i++) {
        ll hgt;
        cin >> hgt;
        h[i] = {hgt, i};
    }

    rgs.insert({0, n - 1});
    totalSum = n * (n + 1) / 2;

    sort(h, h + n, cmpp);

    ll curr = 0;
    for (ll i = 0; i < q; i++) {
        ll pl;
        cin >> pl;
        p[i] = {pl, i};
    }

    sort(p.begin(), p.begin() + q, cmpp);

    vector<ll> result(q);
    for (ll i = 0; i < q; i++) {
        ll plane = p[i].fi, ord = p[i].se;

        while (curr < n && h[curr].fi > plane) {
            rem(h[curr].se);
            curr++;
        }

        result[ord] = totalSum;
    }

    for (ll i = 0; i < q; i++) {
        cout << result[i] << endl;
    }
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...