제출 #673064

#제출 시각아이디문제언어결과실행 시간메모리
673064JooDdaeRegions (IOI09_regions)C++17
60 / 100
3828 ms131072 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int B = 160; int n, r, q, h[200200], p[200200]; int sz[200200], in[200200], out[200200], cnt, lev[200200], head[200200], rev[200200]; vector<int> v[200200], rv[30030], lb[30030]; int dfs_size(int u) { for(auto &x : v[u]) { sz[u] += dfs_size(x); if(sz[x] > sz[v[u][0]]) swap(x, v[u][0]); } return ++sz[u]; } void dfs_hld(int u) { in[u] = ++cnt, lev[u] = lev[p[u]]+1; for(auto x : v[u]) { head[x] = (x == v[u][0] ? head[u] : x); dfs_hld(x); } out[u] = cnt; } int main(){ cin.tie(0)->sync_with_stdio(0); cin >> n >> r >> q >> h[1]; for(int i=2;i<=n;i++) cin >> p[i] >> h[i]; for(int i=1;i<=n;i++) v[p[i]].push_back(i); head[1] = 1, dfs_size(1), dfs_hld(1); for(int i=1;i<=n;i++) rv[h[i]].push_back(in[i]), rev[in[i]] = i; for(int i=1;i<=r;i++) sort(rv[i].begin(), rv[i].end()); for(int i=1;i<=r;i++) if(rv[i].size() >= B) { lb[i].resize(n+1, 0); for(int j=0, k=0;j<=n;j++) { while(k < rv[i].size() && rv[i][k] <= j) k++; lb[i][j] = k; } } map<pair<int, int>, int> mp; while(q--) { int a, b; cin >> a >> b; if(mp.count({a, b})) { cout << mp[{a, b}] << endl; continue; } auto &ans = mp[{a, b}]; if(rv[a].size() <= rv[b].size()) { for(auto x : rv[a]) { int L = x, R = out[rev[x]]; if(!lb[b].empty()) ans += lb[b][R]-lb[b][L-1]; else for(auto y : rv[b]) if(L <= y && y <= R) ans++; } } else { for(auto x : rv[b]) { x = rev[x]; while(x) { int L = in[head[x]], R = in[x]; if(!lb[a].empty()) ans += lb[a][R]-lb[a][L-1]; else for(auto y : rv[a]) if(L <= y && y <= R) ans++; x = p[head[x]]; } } } cout << ans << endl; } }

컴파일 시 표준 에러 (stderr) 메시지

regions.cpp: In function 'int main()':
regions.cpp:42:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   42 |             while(k < rv[i].size() && rv[i][k] <= j) k++;
      |                   ~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...