제출 #1359167

#제출 시각아이디문제언어결과실행 시간메모리
1359167eweirdf274rPilot (NOI19_pilot)C++20
51 / 100
23 ms4760 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

struct DSU {
    vector<int> parent, sz;
    vector<bool> active;
    ll ans = 0;

    DSU(int n) {
        parent.resize(n + 1);
        sz.assign(n + 1, 1);
        active.assign(n + 1, false);
        for (int i = 1; i <= n; i++) parent[i] = i;
    }

    int find(int x) {
        if (parent[x] == x) return x;
        return parent[x] = find(parent[x]);
    }

    ll calc(ll s) {
        return s * (s + 1) / 2;
    }

    void unite(int a, int b) {
        a = find(a);
        b = find(b);
        if (a == b) return;

        // remove old contributions
        ans -= calc(sz[a]);
        ans -= calc(sz[b]);

        parent[b] = a;
        sz[a] += sz[b];

        // add new contribution
        ans += calc(sz[a]);
    }

    void activate(int i) {
        active[i] = true;
        ans += 1; // single node: 1 subarray

        if (i > 1 && active[i - 1]) unite(i, i - 1);
        if (active[i + 1]) unite(i, i + 1);
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, Q;
    cin >> N >> Q;

    vector<int> H(N + 1);
    for (int i = 1; i <= N; i++) cin >> H[i];

    vector<pair<int,int>> order;
    for (int i = 1; i <= N; i++) {
        order.push_back({H[i], i});
    }
    sort(order.begin(), order.end());

    vector<pair<int,int>> queries(Q);
    for (int i = 0; i < Q; i++) {
        cin >> queries[i].first;
        queries[i].second = i;
    }
    sort(queries.begin(), queries.end());

    DSU dsu(N);

    vector<ll> ans(Q);

    int ptr = 0;

    for (auto [Y, idx] : queries) {
        while (ptr < N && order[ptr].first <= Y) {
            dsu.activate(order[ptr].second);
            ptr++;
        }
        ans[idx] = dsu.ans;
    }

    for (int i = 0; i < Q; i++) {
        cout << ans[i] << "\n";
    }

    return 0;
}
#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...