제출 #1308050

#제출 시각아이디문제언어결과실행 시간메모리
1308050simona1230Prize (CEOI22_prize)C++20
0 / 100
493 ms186236 KiB
#include <bits/stdc++.h> using namespace std; const int maxn=1e6+5; int r[2]; vector<int> v[2][maxn]; int n,k,q,t; void read() { cin>>n>>k>>q>>t; for(int i=1;i<=n;i++) { int x; cin>>x; if(x==-1)r[0]=i; else v[0][x].push_back(i); } for(int i=1;i<=n;i++) { int x; cin>>x; if(x==-1)r[1]=i; else v[1][x].push_back(i); } } int cnt=0; vector<int> p; vector<pair<int,int> > v2[maxn]; vector<pair<int,int> > qr; void dfsp(int i,int pr) { if(cnt==k)return; cnt++; p.push_back(i); if(pr!=-1)qr.push_back({pr,i}); for(int j=0;j<v[0][i].size();j++) { int nb=v[0][i][j]; dfsp(nb,i); } } int ans[maxn]; vector<int> e; int num=1; int w[maxn],in[maxn]; int op[maxn]; int id[maxn]; void dfs2(int i,int p) { op[num]=i; in[i]=num++; id[i]=e.size(); e.push_back(in[i]); for(int j=0;j<v2[i].size();j++) { int nb=v2[i][j].first; if(nb==p)continue; w[nb]=w[i]+v2[i][j].second; dfs2(nb,i); e.push_back(in[i]); } } int minn[2*maxn][32]; int lh[maxn]; void prec() { for(int i=0;i<e.size();i++) minn[i][0]=e[i]; for(int j=1;j<=25;j++) { for(int i=0;i<e.size();i++) { if(i+(1<<(j-1))<maxn) minn[i][j]=min(minn[i][j-1],minn[i+(1<<(j-1))][j-1]); } } for(int i=2;i<maxn;i++) lh[i]=lh[i/2]+1; } int lca(int x,int y) { x=id[x]; y=id[x]; if(x>y)swap(x,y); int len=y-x+1; len=lh[len]; return op[min(minn[x][len],minn[y-(1<<len)+1][len])]; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); read(); dfsp(r[0],-1); for(int i=0;i<p.size();i++) cout<<p[i]<<" "; cout<<endl; cout.flush(); for(int i=0;i<qr.size();i++) { cout<<"? "<<qr[i].first<<" "<<qr[i].second<<endl; } cout<<"!"<<endl; cout.flush(); for(int i=0;i<qr.size();i++) { int a,b,c,d; cin>>a>>b>>c>>d; int x=max(a,b); v2[qr[i].first].push_back({qr[i].second,x}); v2[qr[i].second].push_back({qr[i].first,x}); } dfs2(r[0],-1); prec(); for(int i=0;i<t;i++) { int x,y; cin>>x>>y; int h=lca(x,y); ans[i]={w[x]+w[y]-2*w[h]}; //cout<<h<<"?!?!"<<endl; } for(int i=0;i<t;i++) cout<<ans[i]<<" "<<ans[i]<<endl; cout.flush(); return 0; }
#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...