제출 #1236673

#제출 시각아이디문제언어결과실행 시간메모리
1236673MarwenElarbiPrize (CEOI22_prize)C++20
0 / 100
907 ms162236 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back const int nax = 5e5+5; vector<int> adj[2][nax]; int parent[2][nax]; vector<pair<int,int>> tree[2][nax]; int cnt=0; int n,k,q,t; vector<pair<int,int>> euler(nax); vector<pair<pair<int,int>,int>> inter; int depth[2][nax]; int de[2][nax]; int bj[2][20][nax]; int root; vector<int> answer; vector<pair<int,int>> to_ask; void dfs(int x,int p,int cnt){ if(answer.size()<k&&p!=-1){ answer.push_back(x); to_ask.push_back({x,p}); } for(auto u:adj[0][x]){ if(u==p) continue; dfs(u,x,cnt); } } void compute(int x,int p,int cnt){ for (int i = 1; i < 20; ++i) { bj[cnt][i][x]=bj[cnt][i-1][bj[cnt][i-1][x]]; } for(auto u:tree[cnt][x]){ if(u.fi==p) continue; depth[cnt][u.fi]=depth[cnt][x]+u.se; de[cnt][u.fi]=de[cnt][x]+1; bj[cnt][0][u.fi]=x; compute(u.fi,x,cnt); } return; } int jump(int x,int d,int cnt){ for (int i = 0; i < 20; ++i) { if((1<<i)&d) x=bj[cnt][i][x]; } return x; } int lca(int x,int y,int cnt){ if(de[cnt][x]<de[cnt][y]) swap(x,y); x=jump(x,de[cnt][x]-de[cnt][y],cnt); if(x==y) return x; for (int i = 19; i >= 0; --i) { if(bj[cnt][i][x]!=bj[cnt][i][y]){ y=bj[cnt][i][x]; x=bj[cnt][i][y]; } } return bj[cnt][0][x]; } int main() { cin>>n>>k>>q>>t; for (int i = 1; i <= n; ++i) { int x; cin>>x; if(x!=-1){ adj[0][x].pb(i); adj[0][i].pb(x); }else root=i; } for (int i = 1; i <= n; ++i) { int x; cin>>x; } bj[cnt][0][root]=root; answer.push_back(root); dfs(root,-1,0); for(auto u : answer) cout <<u<<" "; cout <<"\n"; for(auto u:to_ask){ int a,b,c,d; cout << "? "<<u.fi<<" "<<u.se<<"\n"; cin>>a>>b>>c>>d; tree[0][u.fi].push_back({u.se,a}); tree[0][u.se].push_back({u.fi,a}); } compute(root,-1,0); cout <<"!\n"; cout<<flush; fflush(stdout); vector<pair<int,int>> query; while(t--){ int a,b; cin>>a>>b; query.push_back({a,b}); } for(auto u:query){ int a = u.fi; int b = u.se; cout << depth[0][a]+depth[0][b]-2*depth[0][lca(a,b,0)] << " " << depth[0][a]+depth[0][b]-2*depth[0][lca(a,b,0)] <<"\n"; } cout<<flush; fflush(stdout); }
#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...