Submission #1156721

#TimeUsernameProblemLanguageResultExecution timeMemory
1156721minh30082008Regions (IOI09_regions)C++20
100 / 100
3154 ms35984 KiB
#include<bits/stdc++.h> #define INF 1e18 #define fi first #define se second #define FOR(i, k, n) for(ll i = k; i <= n; i++) #define FOR1(i, k, n) for(ll i = k; i >= n; i--) #define pb push_back #define fastio ios::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define vi vector<int> #define pii pair<int, int> #define vii vector<pii> #define ll long long #define vll vector<ll> #define pll pair<ll, ll> #define re return 0 #define mii map<int, int> #define input "chinaflu.inp" #define output "chinaflu.out" #define rf freopen(input, "r", stdin); freopen(output, "w", stdout) using namespace std; const int maxn = 2e5 + 5; const int mod = 1e9 + 9; const int base = 998244353; void add(int &a, int b) { a += b; if(a >= mod) a -= mod; if(a < 0) a += mod; } mt19937 rd(chrono::steady_clock::now().time_since_epoch().count()); int rand(int l, int r) { return uniform_int_distribution<int>(l, r) (rd); } vi adj[maxn]; int tin[maxn], tout[maxn]; int region[maxn], timedfs; vi vt[maxn]; ll dp[405][25005]; vi vung[25005]; int tmp, cnt, dem, pos[25005]; void DFS(int u, int par) { tin[u] = ++timedfs; vt[region[u]].pb(timedfs); for(auto v : adj[u]) { if(v == par) continue; DFS(v, u); } tout[u] = timedfs; } void calc(int u, int par) { dp[cnt][region[u]] += dem; if(region[u] == tmp) dem++; for(auto v : adj[u]) { if(v == par) continue; calc(v, u); } if(region[u] == tmp) dem--; } int main() { fastio; int n, r, q; cin >> n >> r >> q; cin >> region[1]; vung[region[1]].pb(1); FOR(i, 2, n) { int par; cin >> par >> region[i]; adj[par].pb(i); adj[i].pb(par); vung[region[i]].pb(i); } timedfs = 0; DFS(1, 0); FOR(i, 1, 25000) if(vung[i].size() > 500) { cnt++; tmp = i; dem = 0; pos[i] = cnt; calc(1, 0); } while(q--) { int u, v; cin >> u >> v; if(vung[u].size() > 500) { cout << dp[pos[u]][v] << endl; continue; } ll ans = 0; for(auto x : vung[u]) { int l = tin[x]; int r = tout[x]; ans += upper_bound(vt[v].begin(), vt[v].end(), r) - upper_bound(vt[v].begin(), vt[v].end(), l); } cout << ans << endl; } re; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...