Submission #899713

#TimeUsernameProblemLanguageResultExecution timeMemory
899713boyliguanhanRegions (IOI09_regions)C++17
85 / 100
8090 ms86100 KiB
#include<bits/stdc++.h> #include<bits/extc++.h> using namespace __gnu_pbds; #pragma GCC optimize(2) #define l int int read(){ char x = getchar(); int val = 0; while(x<'0'||x>'9')x=getchar(); while('0'<=x&&x<='9') val = val*10+x-'0', x=getchar(); return val; } void print(int num){ if(num<0){ putchar('-'); num*=-1; } if(num>9) { print(num/10); } putchar((num%10)^48); } using namespace std; vector<l> adj[200001]; vector<pair<l,l>> arr[25001]; l region[200001], t, in[200001], out[200001], li[200001], sz[25001], lg[401]; map<int,int> ans1[401]; map<int,array<int,401>> ans2; void merge(map<l, l> &a, map<l, l> b){ if(a.size()<b.size()) swap(a, b); for(auto i: b) a[i.first]+=i.second; } map<l,l> dfs(l n){ 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(){ l n=read(), r=read(), q=read(), lr=0; region[1]=read(); for(l i = 2; i <= n; i++){ adj[read()].push_back(i); region[i] = read(); sz[region[i]]++; } for(int i = 1; i <= r; i++) if(sz[i]>500) lg[lr]=i, li[i]=++lr; dfs(1); while(q--){ int r1=read(), r2=read(); if(li[r1]) print(ans1[li[r1]][r2]); else if(li[r2]) print(ans2[r1][li[r2]]); else print(query_s(r1, r2)); puts(""); fflush(stdout); } return 0; }

Compilation message (stderr)

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