Submission #1071887

#TimeUsernameProblemLanguageResultExecution timeMemory
1071887ArthuroWichRegions (IOI09_regions)C++17
80 / 100
8101 ms32732 KiB
#include <bits/stdc++.h>
using namespace std;
vector<int> adj[300005], reg[25005], regst[25005], calc[25005];
int st[300005], en[300005], timer = 0;
void dfs(int i, int p) {
    st[i] = timer;
    timer++;
    for (int j : adj[i]) {
        if (j == p) {
            continue;
        }
        dfs(j, i);
    }
    en[i] = timer;
}
void solve() {
    int n, r, q;
    cin >> n >> r >> q;
    for (int i = 1; i <= n; i++) {
        int s, h;
        if (i == 1) {
            cin >> h;
            reg[h].push_back(i);
        } else {
            cin >> s >> h;
            reg[h].push_back(i);
            adj[s].push_back(i);
            adj[i].push_back(s);
        }
    }
    dfs(1, -1);
    for (int i = 1; i <= r; i++) {
        for (int j : reg[i]) {
            regst[i].push_back(st[j]);
        }
        sort(regst[i].begin(), regst[i].end());
    }
    int block = 400;
    for (int a = 1; a <= r; a++) {
        if (reg[a].size() > 400) {
            calc[a].resize(r+1, 0);
            for (int b = 1; b <= r; b++) {
                if (a == b) {
                    continue;   
                }
                for (int i : reg[a]) {
                    int l, r;
                    l = upper_bound(regst[b].begin(), regst[b].end(), st[i]) - regst[b].begin();
                    r = lower_bound(regst[b].begin(), regst[b].end(), en[i]) - regst[b].begin();
                    calc[a][b] += r-l;
                }
            }
        }
    }
    while(q--) {
        int a, b, ans = 0;
        cin >> a >> b;
        if (reg[a].size() <= 400) {
            for (int i : reg[a]) {
                int l, r;
                l = upper_bound(regst[b].begin(), regst[b].end(), st[i]) - regst[b].begin();
                r = lower_bound(regst[b].begin(), regst[b].end(), en[i]) - regst[b].begin();
                ans += r-l;
            }
        } else {
            ans += calc[a][b];
        }
        cout << ans << endl;
    }
}
int32_t main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t;
    t = 1;
    while(t--) {
        solve();
    }
}

Compilation message (stderr)

regions.cpp: In function 'void solve()':
regions.cpp:38:9: warning: unused variable 'block' [-Wunused-variable]
   38 |     int block = 400;
      |         ^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...