제출 #648829

#제출 시각아이디문제언어결과실행 시간메모리
648829ymmRegions (IOI09_regions)C++17
100 / 100
4383 ms30116 KiB
#include <bits/stdc++.h> #define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x) #define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x) typedef long long ll; typedef std::pair<int, int> pii; typedef std::pair<ll , ll > pll; using namespace std; const int S = 512; const int N = 200'010 + S; const int R = 25'010 + S; int reg[N]; vector<int> reg_st_list[R]; vector<int> reg_list[R]; int cnt_reg[R]; int comp_big[R]; vector<int> big_list; int ans_big[N/S][R]; int cnt_anc[R]; vector<int> A[N]; int st[N], ft[N]; int n, r, q; void dfs(int v, int &t) { st[v] = t++; reg_st_list[reg[v]].push_back(st[v]); for (int big : big_list) ans_big[comp_big[big]][reg[v]] += cnt_anc[big]; cnt_anc[reg[v]]++; for (int u : A[v]) dfs(u, t); cnt_anc[reg[v]]--; ft[v] = t; } int main() { cin.tie(0) -> sync_with_stdio(false); cin >> n >> r >> q; cin >> reg[0]; --reg[0]; Loop (i,1,n) { int p; cin >> p >> reg[i]; --reg[i]; A[p-1].push_back(i); } Loop (i,0,n) { reg_list[reg[i]].push_back(i); cnt_reg[reg[i]]++; } Loop (i,0,r) { if (cnt_reg[i] >= S) { comp_big[i] = big_list.size(); big_list.push_back(i); } } dfs(0, *new int(0)); while (q--) { int r1, r2; cin >> r1 >> r2; --r1; --r2; if (cnt_reg[r1] >= S) { cout << ans_big[comp_big[r1]][r2] << '\n'; } else { int ans = 0; for (int v : reg_list[r1]) { auto it1 = lower_bound(reg_st_list[r2].begin(), reg_st_list[r2].end(), st[v]); auto it2 = lower_bound(reg_st_list[r2].begin(), reg_st_list[r2].end(), ft[v]); ans += it2 - it1; } cout << ans << '\n'; } cout.flush(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...