제출 #228816

#제출 시각아이디문제언어결과실행 시간메모리
228816osaaateiasavtnlRegions (IOI09_regions)C++14
19 / 100
417 ms131076 KiB
#include<bits/stdc++.h> using namespace std; #define ii pair <int, int> #define app push_back #define all(a) a.begin(), a.end() #define bp __builtin_popcount #define ll long long #define mp make_pair #define f first #define s second #define Time (double)clock()/CLOCKS_PER_SEC #ifdef HOME const int N = 2007; #else const int N = 4e5 + 7; #endif const int K = 500; //K - number of vertices in big color const int T = N/K + 7; //T - number of big colors int n, R, q; int color[N], par[N]; vector <int> tree[N], pos[N], who[N]; int num[N]; int cnt[N][T]; int l[N], r[N], ptr = 0; void dfs(int u) { l[u] = ++ptr; pos[color[u]].app(l[u]); for (int v : tree[u]) { dfs(v); for (int i = 0; i < T; ++i) cnt[u][i] += cnt[v][i]; if (num[color[v]] != -1) ++cnt[u][num[color[v]]]; } r[u] = ptr; } signed main() { #ifdef HOME freopen("input.txt", "r", stdin); #endif cin >> n >> R >> q; cin >> color[1]; for (int i = 2; i <= n; ++i) { cin >> par[i] >> color[i]; tree[par[i]].app(i); } for (int i = 1; i <= n; ++i) who[color[i]].app(i); int ptr = 0; for (int i = 1; i <= R; ++i) { if (who[i].size() > K) num[i] = ptr++; else num[i] = -1; } dfs(1); map <ii, int> mem; while (q--) { int c1, c2; cin >> c1 >> c2; if (mem.find(mp(c1, c2)) != mem.end()) { cout << mem[mp(c1, c2)] << endl; continue; } int ans = 0; if (num[c2] != -1) { for (int u : who[c1]) ans += cnt[u][num[c2]]; } else { vector <int> &a = pos[c2]; for (int u : who[c1]) { ans += upper_bound(all(a), r[u]) - upper_bound(all(a), l[u]); } } cout << ans << endl; mem[mp(c1, c2)] = ans; fflush(stdout); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...