제출 #1265441

#제출 시각아이디문제언어결과실행 시간메모리
1265441_filya_Regions (IOI09_regions)C++20
0 / 100
84 ms41104 KiB
#include<bits/stdc++.h> typedef long long ll; using namespace std; const int N = 2e5 + 50; vector<int> G[N], re[N]; int t = 0, tin1[N], tout1[N], tour2[2 * N], tin2[N], tout2[N], c[N], n, r, q, b; vector<array<int, 2>> que1[N]; struct Fenwick { int n; vector<long long> tree; Fenwick(int size) : n(size), tree(size + 1) {} void update(int idx, long long delta) { for (; idx <= n; idx += idx & -idx) tree[idx] += delta; } long long query(int idx) { long long res = 0; for (; idx > 0; idx -= idx & -idx) res += tree[idx]; return res; } long long query(int l, int r) { return query(r) - query(l - 1); } }; void dfs2(int s, int p) { tin2[s] = t; tour2[t++] = s; for (auto u : G[s]) { if (u == p) continue; dfs2(u, s); } tout2[s] = t; tour2[t++] = s; } void dfs1(int s, int p) { tin1[s] = t++; for (auto u : G[s]) { if (u == p) continue; dfs1(u, s); } tout1[s] = t; } int main() { // ifstream cin("input.txt"); // ofstream cout("output.txt"); ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> r >> q; b = sqrt(n); for (int i = 0; i < n; i++) { int u, v, w; if (i == 0) { cin >> w; c[i] = w; re[w].push_back(u); } else { u = i + 1; cin >> v >> w; u--; v--; G[u].push_back(v); G[v].push_back(u); c[u] = w; re[w].push_back(u); } } t = 0; dfs1(0, 0); t = 0; dfs2(0, 0); vector<ll> ans(q); for (int i = 0; i < q; i++) { int a, b; cin >> a >> b; que1[b].push_back({a, i}); } for (int rr = 1; rr <= r; rr++) sort(que1[rr].begin(), que1[rr].end()); vector<int> cnt(r + 1, 0); vector<int> huge; for (int i = 0; i < 2 * n; i++) { int cur = tour2[i]; if (i == tin2[cur]) { if (que1[c[cur]].size() <= b) { for (auto u : que1[c[cur]]) { ans[u[1]] += cnt[u[0]]; } } cnt[c[cur]]++; } else { cnt[c[cur]]--; } } for (int r1 = 1; r1 <= r; r1++) { if (que1[r1].size() <= b) continue; Fenwick tree(n); for (auto u : re[r1]) { tree.update(tin1[u] + 1, 1); } array<int, 2> last = {0, 0}; for (auto r2 : que1[r1]) { if (r2[0] != last[0]) { for (auto u : re[r2[0]]) { ans[r2[1]] += tree.query(tin1[u] + 1, tout1[u]); } } else { ans[r2[1]] = ans[last[1]]; } last = r2; } } for (auto u : ans) cout << u << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...