제출 #1328878

#제출 시각아이디문제언어결과실행 시간메모리
1328878aloszaRegions (IOI09_regions)C++20
100 / 100
2788 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++;
    for(int i : graph[v]) dfs(i);
    tout[v] = t++;
}

void dfs1(int v, int col, int num)
{
    int t = num;
    if(reg[v] == col) t++;
    else vec[reg[v]] += num;
    for(int i : graph[v]) dfs1(i, col, 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++)
    {
        if(num_reg[i] < 500) continue;
        fill(vec, vec + r, 0);
        dfs1(0, i, 0);
        idx[i] = cnt++;
        for(int j = 0; j < r; j++)
        {
            res[idx[i]][j] = vec[j];
        }
    }
    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[r1] >= 500) cout << res[idx[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...