Submission #687163

#TimeUsernameProblemLanguageResultExecution timeMemory
687163boyliguanhanRegions (IOI09_regions)C++17
90 / 100
8058 ms82388 KiB
#include<bits/stdc++.h> #pragma GCC optimize(3) #define l long long using namespace std; vector<l> adj[200001], lg; vector<pair<l,l>> arr[25001]; l region[200001], t, ans1[21][25001], ans2[25001][21], in[200001], out[200001], li[200001], sz[25001]; void merge(unordered_map<l, l> &a, unordered_map<l, l> b){ if(a.size()<b.size()) swap(a, b); for(auto i: b) a[i.first]+=i.second; } unordered_map<l,l> dfs(l n){ unordered_map<l,l> cur; cur[region[n]]=1; in[n]=t++; arr[region[n]].push_back({in[n],1}); for(auto i: adj[n]){ merge(cur, dfs(i)); } out[n]=t++; arr[region[n]].push_back({out[n],0}); if(li[region[n]]) for(auto i: cur) ans1[li[region[n]]][i.first]+=i.second; else for(auto i: lg) ans2[region[n]][li[i]]+=cur[i]; return cur; } l query_s(int r1, int r2){ l sum=0, o=0, a=0, b=0; vector<int> v; while(a<arr[r1].size()||b<arr[r2].size()){ if(a<arr[r1].size()&&b<arr[r2].size()){ if(arr[r1][a]<arr[r2][b]) v.push_back(arr[r1][a].second*2-1), a++; else v.push_back(0), b++; } else if(a<arr[r1].size()) v.push_back(arr[r1][a].second*2-1), a++; else v.push_back(0), b++; } for(auto i: v) if(i) o+=i; else sum+=o; return sum/2; } int main(){ iostream::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); l n, r, q, lr=0; cin >> n >> r >> q; cin >> region[1]; for(l i = 2; i <= n; i++){ l p; cin >> p >> region[i]; sz[region[i]]++; adj[p].push_back(i); } for(int i = 1; i <= r; i++) if(sz[i]>10000) lg.push_back(i), li[i]=++lr; dfs(1); while(q--){ int r1, r2; cin >> r1 >> r2; if(li[r1]) cout << ans1[li[r1]][r2] << endl; else if(li[r2]) cout << ans2[r1][li[r2]] << endl; else cout << query_s(r1, r2) << endl; } return 0; }

Compilation message (stderr)

regions.cpp: In function 'long long int query_s(int, int)':
regions.cpp:35:12: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   35 |     while(a<arr[r1].size()||b<arr[r2].size()){
      |           ~^~~~~~~~~~~~~~~
regions.cpp:35:30: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   35 |     while(a<arr[r1].size()||b<arr[r2].size()){
      |                             ~^~~~~~~~~~~~~~~
regions.cpp:36:13: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |         if(a<arr[r1].size()&&b<arr[r2].size()){
      |            ~^~~~~~~~~~~~~~~
regions.cpp:36:31: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |         if(a<arr[r1].size()&&b<arr[r2].size()){
      |                              ~^~~~~~~~~~~~~~~
regions.cpp:41:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   41 |         } else if(a<arr[r1].size())
      |                   ~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...