제출 #1359170

#제출 시각아이디문제언어결과실행 시간메모리
1359170eweirdf274rPilot (NOI19_pilot)C++20
100 / 100
302 ms38872 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef long long ll;

struct DSU {
    vector<int> parent;
    vector<int> sz;
    DSU(int n) {
        parent.resize(n + 1);
        sz.resize(n + 1, 1);
        for (int i = 1; i <= n; i++) parent[i] = i;
    }
    int find(int i) {
        if (parent[i] == i) return i;
        return parent[i] = find(parent[i]);
    }
    void unite(int i, int j) {
        int root_i = find(i);
        int root_j = find(j);
        if (root_i != root_j) {
            parent[root_i] = root_j;
            sz[root_j] += sz[root_i];
        }
    }
};

ll calculate_flights(ll L) {
    return (L * (L + 1)) / 2;
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int N, Q;
    cin >> N >> Q;

    vector<pair<int, int>> mountains(N);
    for (int i = 0; i < N; i++) {
        cin >> mountains[i].first;
        mountains[i].second = i + 1;
    }
    sort(mountains.begin(), mountains.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<bool> active(N + 2, false);
    vector<ll> results(Q);
    ll current_ans = 0;
    int m_idx = 0;

    for (int i = 0; i < Q; i++) {
        int limit = queries[i].first;
        while (m_idx < N && mountains[m_idx].first <= limit) {
            int pos = mountains[m_idx].second;
            active[pos] = true;
            current_ans += calculate_flights(1);

            if (active[pos - 1]) {
                ll sz_left = dsu.sz[dsu.find(pos - 1)];
                ll sz_curr = dsu.sz[dsu.find(pos)];
                current_ans -= calculate_flights(sz_left);
                current_ans -= calculate_flights(sz_curr);
                dsu.unite(pos - 1, pos);
                current_ans += calculate_flights(dsu.sz[dsu.find(pos)]);
            }
            if (active[pos + 1]) {
                ll sz_right = dsu.sz[dsu.find(pos + 1)];
                ll sz_curr = dsu.sz[dsu.find(pos)];
                current_ans -= calculate_flights(sz_right);
                current_ans -= calculate_flights(sz_curr);
                dsu.unite(pos + 1, pos);
                current_ans += calculate_flights(dsu.sz[dsu.find(pos)]);
            }
            m_idx++;
        }
        results[queries[i].second] = current_ans;
    }

    for (ll res : results) cout << res << "\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...