제출 #1265441

#제출 시각아이디문제언어결과실행 시간메모리
1265441_filya_Regions (IOI09_regions)C++20
0 / 100
84 ms41104 KiB
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;

const int N = 2e5 + 50;
vector<int> G[N], re[N];
int t = 0, tin1[N], tout1[N], tour2[2 * N], tin2[N], tout2[N], c[N], n, r, q, b;

vector<array<int, 2>> que1[N];

struct Fenwick {
    int n;
    vector<long long> tree;

    Fenwick(int size) : n(size), tree(size + 1) {}

    void update(int idx, long long delta) {
        for (; idx <= n; idx += idx & -idx)
            tree[idx] += delta;
    }

    long long query(int idx) {
        long long res = 0;
        for (; idx > 0; idx -= idx & -idx)
            res += tree[idx];
        return res;
    }

    long long query(int l, int r) {
        return query(r) - query(l - 1);
    }
};

void dfs2(int s, int p) {
    tin2[s] = t;
    tour2[t++] = s;
    for (auto u : G[s]) {
        if (u == p) continue;
        dfs2(u, s);
    }
    tout2[s] = t;
    tour2[t++] = s;
}

void dfs1(int s, int p) {
    tin1[s] = t++;
    for (auto u : G[s]) {
        if (u == p) continue;
        dfs1(u, s);
    }
    tout1[s] = t;
}

int main()
{
// 	ifstream cin("input.txt");
//     ofstream cout("output.txt");
	ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
	cin >> n >> r >> q;
    b = sqrt(n);
    for (int i = 0; i < n; i++) {
        int u, v, w; 
        if (i == 0) {
            cin >> w;
            c[i] = w;
            re[w].push_back(u);
        } else {
            u = i + 1;
            cin >> v >> w;
            u--; v--;
            G[u].push_back(v);
            G[v].push_back(u);
            c[u] = w;
            re[w].push_back(u);
        }
    }
    t = 0;
    dfs1(0, 0);
    t = 0;
    dfs2(0, 0);
    vector<ll> ans(q);
    for (int i = 0; i < q; i++) {
        int a, b; cin >> a >> b;
        que1[b].push_back({a, i});
    }
    for (int rr = 1; rr <= r; rr++) sort(que1[rr].begin(), que1[rr].end());
    vector<int> cnt(r + 1, 0);
    vector<int> huge;
    for (int i = 0; i < 2 * n; i++) {
        int cur = tour2[i];
        if (i == tin2[cur]) {
            if (que1[c[cur]].size() <= b) {
                for (auto u : que1[c[cur]]) {
                    ans[u[1]] += cnt[u[0]];
                }
            }
            cnt[c[cur]]++;
        } else {
            cnt[c[cur]]--;
        }
    }
    for (int r1 = 1; r1 <= r; r1++) {
        if (que1[r1].size() <= b) continue;
        Fenwick tree(n);
        for (auto u : re[r1]) {
            tree.update(tin1[u] + 1, 1);
        }
        array<int, 2> last = {0, 0};
        for (auto r2 : que1[r1]) {
            if (r2[0] != last[0]) {
                for (auto u : re[r2[0]]) {
                    ans[r2[1]] += tree.query(tin1[u] + 1, tout1[u]);
                }
            } else {
                ans[r2[1]] = ans[last[1]];
            }
            last = r2;
        }
    }
    for (auto u : ans) cout << u << '\n';
}   
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...