제출 #1339350

#제출 시각아이디문제언어결과실행 시간메모리
1339350ericl23302Regions (IOI09_regions)C++20
100 / 100
3307 ms48156 KiB
#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

using ll = long long;

const ll SQRT = 500;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    ll n, r, q;
    cin >> n >> r >> q;
    vector<vector<ll>> regions(r + 1), tins(r + 1);
    vector<pair<ll, ll>> employees(n + 1);
    vector<vector<ll>> adjacency(n + 1);
    for (ll i = 1; i <= n; ++i) {
        if (i > 1) {
            cin >> employees[i].second >> employees[i].first;
            adjacency[employees[i].second].push_back(i);
        } else
            cin >> employees[i].first;
        regions[employees[i].first].push_back(i);
    }

    vector<ll> tin(n + 1), tout(n + 1);
    ll cnt = 1;

    auto euler = [&](ll cur, auto euler) -> void {
        tin[cur] = cnt++;
        tins[employees[cur].first].push_back(tin[cur]);
        for (auto& i : adjacency[cur]) euler(i, euler);
        tout[cur] = cnt++;
    };

    euler(1, euler);
    for (auto& i : tins) sort(i.begin(), i.end());

    vector<vector<ll>> heavy(r + 1);
    auto dfs = [&](ll cur, ll pCnt, ll i, auto dfs) -> void {
        if (employees[cur].first == i) ++pCnt;
        heavy[i][employees[cur].first] += pCnt;
        for (auto& j : adjacency[cur]) dfs(j, pCnt, i, dfs);
    };

    for (ll i = 1; i <= r; ++i) {
        if (regions[i].size() < SQRT) continue;
        heavy[i].assign(r + 1, 0);
        dfs(1, 0, i, dfs);
    }

    while (q--) {
        ll r1, r2;
        cin >> r1 >> r2;
        if (heavy[r1].size())
            cout << heavy[r1][r2] << endl;
        else {
            ll res = 0;
            for (auto& i : regions[r1])
                res += upper_bound(tins[r2].begin(), tins[r2].end(), tout[i]) -
                       lower_bound(tins[r2].begin(), tins[r2].end(), tin[i]);
            cout << res << endl;
        }
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...