제출 #1328869

#제출 시각아이디문제언어결과실행 시간메모리
1328869aloszaRegions (IOI09_regions)C++20
45 / 100
8070 ms25524 KiB
#include <bits/stdc++.h>

using namespace std;

vector<vector<int>> graph;
vector<vector<int>> regs;
int tin[200005], tout[200005];
int reg[200005];
int num_reg[200005];
int t = 0, cnt = 0;

int vec[25005];
int idx[25005];
int res[505][25005];
int n, r, q;
void dfs(int v)
{
    tin[v] = t++;
    if(num_reg[reg[v]] >= 500)
    {
        if(idx[reg[v]] == -1) idx[reg[v]] = cnt++;
        for(int i = 0; i < r; i++) res[idx[reg[v]]][i] += vec[i];
    }
    for(int i : graph[v]) dfs(i);
    vec[reg[v]]++;
    tout[v] = t++;
}

signed main()
{
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> r >> q;

    graph.resize(n);
    regs.resize(r);

    cin >> reg[0];
    reg[0]--;
    regs[reg[0]].push_back(0);
    for(int i = 1; i < n; i++)
    {
        int a;
        cin >> a;
        a--;
        graph[a].push_back(i);
        cin >> reg[i];
        reg[i]--;
        regs[reg[i]].push_back(i);
        num_reg[reg[i]]++;
    }

    fill(idx, idx + r, -1);
    dfs(0);

    for(int i = 0; i < r; i++) sort(regs[i].begin(), regs[i].end(), [&](int a, int b){return tin[a] < tin[b];});

    while(q--)
    {
        int r1, r2;
        cin >> r1 >> r2;
        r1--, r2--;

        if(num_reg[reg[r1]] >= 500) cout << res[idx[reg[r1]]][r2] << endl;
        else
        {
            int res = 0;
            for(int i : regs[r1])
            {
                res += lower_bound(regs[r2].begin(), regs[r2].end(), tout[i], [&](int a, int b){return tin[a] < b;}) -
                        lower_bound(regs[r2].begin(), regs[r2].end(), tin[i], [&](int a, int b){return tin[a] < b;});
            }
            cout << res << endl;
        }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...