Submission #1111732

#TimeUsernameProblemLanguageResultExecution timeMemory
1111732noyancanturkPrize (CEOI22_prize)C++17
0 / 100
2617 ms632572 KiB
#include<bits/stdc++.h> using namespace std; #define pb push_back #define int long long using pii=pair<int,int>; const int lim=1e6+100; int n,k,q,t; vector<int>v[lim],u[lim]; int lift1[lim][25],lift2[lim][25]; int tin1[lim],tin2[lim],tout1[lim],tout2[lim]; int dep1[lim],dep2[lim]; int tt=1; unordered_set<int>dudes; void edfs(int node){ for(int i=1;i<=23;i++) lift1[node][i]=lift1[lift1[node][i-1]][i-1]; tin1[node]=tt++; if(dudes.size()<k)dudes.insert(node); for(int j:v[node]){ lift1[j][0]=node; edfs(j); } tout1[node]=tt-1; } vector<int>order; void odfs(int node){ for(int i=1;i<=23;i++) lift2[node][i]=lift2[lift2[node][i-1]][i-1]; tin2[node]=tt++; if(dudes.count(node)){ order.pb(node); } for(int j:u[node]){ lift2[j][0]=node; odfs(j); } tout2[node]=tt-1; } #define ispar1(x,y) (tin1[x]<=tin1[y]&&tout1[y]<=tout1[x]) #define ispar2(x,y) (tin2[x]<=tin2[y]&&tout2[y]<=tout2[x]) int lca1(int x,int y){ if(ispar1(x,y))return x; if(ispar1(y,x))return y; for(int i=23;0<=i;i--){ if(lift1[x][i]&&!ispar1(lift1[x][i],y))x=lift1[x][i]; } assert(ispar1(lift1[x][0],y)&&!ispar1(x,y)); return lift1[x][0]; } int lca2(int x,int y){ if(ispar2(x,y))return x; if(ispar2(y,x))return y; for(int i=23;0<=i;i--){ if(lift2[x][i]&&!ispar2(lift2[x][i],y))x=lift2[x][i]; } assert(ispar2(lift2[x][0],y)&&!ispar2(x,y)); return lift2[x][0]; } signed main(){ cin>>n>>k>>q>>t; int root1,root2; for(int i=1;i<=n;i++){ cin>>lift1[i][0]; if(lift1[i][0]==-1)root1=i,lift1[i][0]++; else v[lift1[i][0]].pb(i); } for(int i=1;i<=n;i++){ cin>>lift2[i][0]; if(lift2[i][0]==-1)root2=i,lift2[i][0]++; else u[lift2[i][0]].pb(i); } tt=1; edfs(root1); for(int i:dudes)cout<<i<<' '; cout<<endl; cout.flush(); odfs(root2); for(int i=0;i+1<order.size();i++){ cout<<"? "<<order[i]<<' '<<order[i+1]<<endl; } cout<<"!"; cout<<endl; cout.flush(); dep1[order[0]]=dep2[order[0]]=0; for(int i=0;i+1<order.size();i++){ int a,b,c,d; cin>>a>>b>>c>>d; int l1=lca1(order[i],order[i+1]); int l2=lca2(order[i],order[i+1]); dep1[l1]=dep1[order[i]]-a; dep2[l2]=dep2[order[i]]-c; dep1[order[i+1]]=dep1[l1]+b; dep2[order[i+1]]=dep2[l2]+d; } for(int i=0;i<t;i++){ int x,y; cin>>x>>y; int l1=lca1(x,y); int l2=lca2(x,y); cout<<dep1[x]+dep1[y]-2*dep1[l1]<<' '<<dep2[x]+dep2[y]-2*dep2[l2]<<endl; } assert(0); cout.flush(); }

Compilation message (stderr)

Main.cpp: In function 'void edfs(long long int)':
Main.cpp:23:18: warning: comparison of integer expressions of different signedness: 'std::unordered_set<long long int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
   23 |   if(dudes.size()<k)dudes.insert(node);
      |      ~~~~~~~~~~~~^~
Main.cpp: In function 'int main()':
Main.cpp:87:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   87 |   for(int i=0;i+1<order.size();i++){
      |               ~~~^~~~~~~~~~~~~
Main.cpp:94:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   94 |   for(int i=0;i+1<order.size();i++){
      |               ~~~^~~~~~~~~~~~~
Main.cpp:82:7: warning: 'root1' may be used uninitialized in this function [-Wmaybe-uninitialized]
   82 |   edfs(root1);
      |   ~~~~^~~~~~~
Main.cpp:86:7: warning: 'root2' may be used uninitialized in this function [-Wmaybe-uninitialized]
   86 |   odfs(root2);
      |   ~~~~^~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...