제출 #738928

#제출 시각아이디문제언어결과실행 시간메모리
738928lorenzoferrariRegions (IOI09_regions)C++17
70 / 100
6366 ms131072 KiB
#pragma GCC target("avx2") #pragma GCC optimize("O3") #include "bits/stdc++.h" using namespace std; using LL = long long; static constexpr int N = 200000; static constexpr int R = 25000; static constexpr int SQ = 350; struct Segtree { int n; vector<int> t; Segtree(int n) : n(n), t(2*n) {} void update(int p, int v) { for (t[p += n] += v; p > 1; p >>= 1) { t[p >> 1] = t[p] + t[p ^ 1]; } } int query(int l, int r) { int ans = 0; for (l += n, r += n; l < r; l >>= 1, r >>= 1) { if (l & 1) ans += t[l++]; if (r & 1) ans += t[--r]; } return ans; } }; static int h[N], p[N], f[R], in[N], out[N]; static vector<int> fi(R, -1), ff; static vector<int> adj[N]; static vector<int> vs[R]; static LL sub[R][N / SQ]; static LL anc[R][N / SQ]; int t = 0; static void dfs0(int v) { in[v] = t++; for (int u : adj[v]) { dfs0(u); } out[v] = t; } static int dfs1(int v, const int i, int acc = 0) { int cnt = 0; for (int u : adj[v]) { cnt += dfs1(u, i, acc + (h[v] == ff[i])); } sub[h[v]][i] += cnt; anc[h[v]][i] += acc; return cnt + (h[v] == ff[i]); } int main() { int n; cin >> n; int r; cin >> r; int q; cin >> q; cin >> h[0]; ++f[--h[0]]; for (int i = 1; i < n; ++i) { cin >> p[i] >> h[i]; --p[i], --h[i]; adj[p[i]].push_back(i); ++f[h[i]]; } for (int i = 0; i < r; ++i) { if (f[i] >= SQ) { fi[i] = ff.size(); ff.push_back(i); } } dfs0(0); for (int v = 0; v < n; ++v) { vs[h[v]].push_back(v); } for (int i = 0; i < (int)ff.size(); ++i) { dfs1(0, i); } Segtree st(N); for (int r1, r2; q--;) { cin >> r1 >> r2; --r1, --r2; if (f[r2] >= SQ) { cout << sub[r1][fi[r2]] << endl; } else if (f[r1] >= SQ) { cout << anc[r2][fi[r1]] << endl; } else { LL ans = 0; for (int v : vs[r2]) { st.update(in[v], 1); } for (int u : vs[r1]) { ans += st.query(in[u]+1, out[u]); } for (int v : vs[r2]) { st.update(in[v], -1); } cout << ans << endl; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...