제출 #1033304

#제출 시각아이디문제언어결과실행 시간메모리
1033304s_treeRegions (IOI09_regions)C++17
80 / 100
5077 ms131072 KiB
#include <bits/stdc++.h> using namespace std; #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; template <typename T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; #define vt vector #define rep(i, a, b) for(int i = a; i < (b); ++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() #define pb push_back typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef vector<int> vi; template<class T> bool chmin(T& a, const T& b) { return b<a?a=b, 1:0; } template<class T> bool chmax(T& a, const T& b) { return a<b?a=b, 1:0; } mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); mt19937_64 rng_64(chrono::steady_clock::now().time_since_epoch().count()); const int B = 70; int main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); int n, r, q; cin >> n >> r >> q; vt<vt<int>> g(n+1); vt<vt<int>> col(r+1); vt<int> c(n+1); vt<vt<ll>> precomp(r+1); for(int i = 1;i<=n;i++) { if(i>1) { int par; cin >> par; g[par].pb(i); } int h; cin >> h; c[i] = h; col[h].pb(i); } vt<int> tin(n+1), tout(n+1); int timer=0; vt<vt<int>> tinCol(n+1); vt<vt<int>> toutCol(n+1); auto dfs = [&](int at, auto &&dfs) -> void { tin[at]=++timer; tinCol[c[at]].pb(tin[at]); for(int to:g[at]) { dfs(to, dfs); } tout[at]=++timer; toutCol[c[at]].pb(tout[at]); }; int fixedCol=0; auto dfs2 = [&](int at, auto &&dfs2) -> int { int cnt=0; for(int to:g[at]) { cnt+=dfs2(to, dfs2); } precomp[fixedCol][c[at]]+=cnt; cnt+=(fixedCol==c[at]); return cnt; }; dfs(1, dfs); for(int i = 1;i<=r;i++) { if(sz(col[i])>B) { fixedCol=i; precomp[i].resize(r+1); dfs2(1, dfs2); } } while(q--) { int r1, r2; cin >> r1 >> r2; if(sz(col[r2])>B) { cout << precomp[r2][r1] << endl; } else { ll ans=0; for(int i:col[r2]) { ans+=lower_bound(all(tinCol[r1]), tin[i])-tinCol[r1].begin(); ans-=lower_bound(all(toutCol[r1]), tin[i])-toutCol[r1].begin(); } cout << ans << endl; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...