제출 #1359175

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

struct DSU {
    vector<int> parent, size;
    DSU(int n) {
        parent.resize(n);
        size.assign(n, 0);
        iota(parent.begin(), parent.end(), 0);
    }
    int find(int x) {
        if (parent[x] == x) return x;
        return parent[x] = find(parent[x]);
    }
    long long merge(int a, int b, long long &total) {
        a = find(a); b = find(b);
        if (a == b) return total;
        // remove old contributions
        total -= 1LL * size[a] * (size[a] + 1) / 2;
        total -= 1LL * size[b] * (size[b] + 1) / 2;
        // merge
        parent[b] = a;
        size[a] += size[b];
        // add new contribution
        total += 1LL * size[a] * (size[a] + 1) / 2;
        return total;
    }
};

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

    int N, Q;
    cin >> N >> Q;
    vector<int> H(N);
    for (int i = 0; i < N; i++) cin >> H[i];
    vector<int> Y(Q);
    for (int i = 0; i < Q; i++) cin >> Y[i];

    // Sort mountains by height
    vector<pair<int,int>> mountains;
    for (int i = 0; i < N; i++) mountains.push_back({H[i], i});
    sort(mountains.begin(), mountains.end());

    // Sort queries with original index
    vector<pair<int,int>> queries;
    for (int i = 0; i < Q; i++) queries.push_back({Y[i], i});
    sort(queries.begin(), queries.end());

    DSU dsu(N);
    vector<bool> active(N, false);
    vector<long long> ans(Q);
    long long total = 0;
    int ptr = 0;

    for (auto [y, idx] : queries) {
        // activate mountains with height <= y
        while (ptr < N && mountains[ptr].first <= y) {
            int pos = mountains[ptr].second;
            active[pos] = true;
            dsu.size[pos] = 1;
            total += 1; // single mountain flight
            // merge with left neighbor
            if (pos > 0 && active[pos-1]) dsu.merge(pos, pos-1, total);
            // merge with right neighbor
            if (pos+1 < N && active[pos+1]) dsu.merge(pos, pos+1, total);
            ptr++;
        }
        ans[idx] = total;
    }

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