제출 #649638

#제출 시각아이디문제언어결과실행 시간메모리
649638mychecksedadRegions (IOI09_regions)C++17
30 / 100
5380 ms105468 KiB
/* Author : Mychecksdead */ #include<bits/stdc++.h> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; using namespace std; typedef long long int ll; typedef long double ld; #define MOD (1000000000+7) #define MOD1 (998244353) #define PI 3.1415926535 #define pb push_back #define setp() cout << setprecision(15) #define all(x) x.begin(), x.end() #define debug(x) cerr << #x << " is " << x << '\n'; const int N = 1e6+100, M = 1e5+10, F = 2147483646, K = 20; int n, q, r, a[N], ans[505][505], tin[N], tout[N], timer = 0; vector<int> g[N], R[N], path, pos[N]; map<pair<int, int>, pair<bool, int>> m; void dfs(int v, int p){ bool ok = 1; for(int u: g[v]){ if(u == p) continue; dfs(u, v); if(ok){ ok = 0; R[v].swap(R[u]); continue; } for(int j = 1; j <= r; ++j) R[v][j] += R[u][j]; R[u].clear(); } if(ok) R[v].resize(r + 1); for(int j = 1; j <= r; ++j) ans[a[v]][j] += R[v][j]; R[v][a[v]]++; } void dfs1(int v, int p){ path.pb(v); tin[v] = timer++; R[a[v]].pb(v); for(int u: g[v]){ if(u == p) continue; dfs1(u, v); } path.pb(v); tout[v] = timer++; } void solve(){ cin >> n >> r >> q; cin >> a[1]; for(int i = 2; i <= n; ++i){ int x; cin >> x >> a[i]; g[x].pb(i); g[i].pb(x); } if(r <= 500){ for(int i = 0; i <= r; ++i) for(int j = 0; j <= r; ++j) ans[i][j] = 0; dfs(1, 1); for(;q--;){ int a, b; cin >> a >> b; cout << ans[a][b] << endl; } }else{ dfs1(1, 1); for(int j = 0; j < path.size(); ++j){ pos[a[path[j]]].pb(j); } for(;q--;){ int a, b; cin >> a >> b; if(m[{a, b}].first){ cout << m[{a, b}].second << endl; continue; } int ans = 0; if(R[a].size() < R[b].size()) for(int v: R[a]){ ans += upper_bound(all(pos[b]), tout[v]) - upper_bound(all(pos[b]), tin[v]); } else for(int v: R[b]){ ans += int(pos[a].size()) - (upper_bound(all(pos[a]), tout[v]) - upper_bound(all(pos[a]), tin[v])); } cout << ans/2 << endl; m[{a, b}] = {1, ans/2}; } } } int main(){ cin.tie(0); ios::sync_with_stdio(0); int T = 1, aa; // cin >> T;aa=T; while(T--){ // cout << "Case #" << aa-T << ": "; solve(); // cout << '\n'; } return 0; }

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

regions.cpp: In function 'void solve()':
regions.cpp:67:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |         for(int j = 0; j < path.size(); ++j){
      |                        ~~^~~~~~~~~~~~~
regions.cpp: In function 'int main()':
regions.cpp:97:16: warning: unused variable 'aa' [-Wunused-variable]
   97 |     int T = 1, aa;
      |                ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...