# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
1105504 |
2024-10-26T14:55:38 Z |
epicci23 |
Prize (CEOI22_prize) |
C++17 |
|
672 ms |
120064 KB |
#include "bits/stdc++.h"
//#define int long long
#define all(v) v.begin() , v.end()
#define sz(a) (int)a.size()
using namespace std;
const int N = 5e5 + 5;
const int LOG = 20;
int n,q,k,t;
vector<int> sec;
vector<int> v[N],g[N];
int depth[N],up[N][LOG],in[N],out[N],R;
int par[N],r,tin[N],tout[N],lift[N][LOG],ti=0;
void dfs(int c){
tin[c]=++ti;
for(int i=1;i<LOG;i++) lift[c][i]=lift[lift[c][i-1]][i-1];
for(int x:v[c]){
if(x==par[c]) continue;
dfs(x);
}
tout[c]=ti;
}
void dfs2(int c){
in[c]=++ti;
for(int i=1;i<LOG;i++) up[c][i]=up[up[c][i-1]][i-1];
for(int x:g[c]) dfs2(x);
out[c]=ti;
}
inline bool is_anc(int a,int b){
return tin[a]<=tin[b] && tout[b]<=tout[a];
}
inline int lca(int a,int b){
if(tin[a]>=tin[b]) swap(a,b);
if(is_anc(a,b)) return a;
for(int i=LOG-1;i>=0;i--){
if(!lift[a][i]) continue;
if(!is_anc(lift[a][i],b)) a=lift[a][i];
}
return lift[a][0];
}
inline bool Vis_anc(int a,int b){
return in[a]<=in[b] && out[b]<=out[a];
}
inline int Vlca(int a,int b){
if(in[a]>=in[b]) swap(a,b);
if(Vis_anc(a,b)) return a;
for(int i=LOG-1;i>=0;i--){
if(!up[a][i]) continue;
if(!Vis_anc(up[a][i],b)) a=up[a][i];
}
return up[a][0];
}
inline int dist(int a,int b){
return depth[a]+depth[b]-2*depth[Vlca(a,b)];
}
inline array<int,2> Answer(int a,int b){
return {dist(a,b),dist(a,b)};
}
void kac(int c){
if(sz(sec)==k) return;
sec.push_back(c);
if(sz(sec)==k) return;
for(int x:v[c]) kac(x);
}
void _(){
cin >> n >> k >> q >> t;
for(int i=1;i<=n;i++) cin >> par[i];
for(int i=1;i<=n;i++) cin >> par[i];
for(int i=1;i<=n;i++){
if(par[i]==-1) r=i;
else{
lift[i][0]=par[i];
v[par[i]].push_back(i);
v[i].push_back(par[i]);
}
}
ti=0;
dfs(r);
kac(r);
vector<array<int,2>> ask;
vector<int> virt;
for(int i:sec) virt.push_back(i);
sort(all(virt),[&](int a,int b){return tin[a]<tin[b];});
for(int i=1;i<k;i++) virt.push_back(lca(virt[i-1],virt[i]));
sort(all(virt),[&](int a,int b){return tin[a]<tin[b];});
virt.erase(unique(all(virt)),virt.end());
R=virt[0];
stack<int> s;
for(int x:virt){
while(!s.empty() && !is_anc(s.top(),x)) s.pop();
if(!s.empty()){
ask.push_back({s.top(),x});
up[x][0]=s.top();
g[s.top()].push_back(x);
}
s.push(x);
}
ti=0;
dfs2(R);
for(int x:sec) cout << x << ' ';
cout << endl;
for(auto x:ask) cout << "? " << x[0] << ' ' << x[1] << endl;
cout << '!' << endl;
for(int i=0;i<sz(ask);i++){
int a = ask[i][0] , b = ask[i][1];
int res[4];
cin >> res[0] >> res[1] >> res[2] >> res[3];
depth[b]=depth[a]+res[1];
}
vector<array<int,2>> U;
for(int i=1;i<=t;i++){
int a,b;
cin >> a >> b;
U.push_back({a,b});
}
for(auto S:U){
int a = S[0] , b = S[1];
auto ANS = Answer(a,b);
cout << ANS[0] << ' ' << ANS[1] << endl;
}
}
int32_t main(){
//cin.tie(0); ios::sync_with_stdio(0);
int tc=1;//cin >> tc;
while(tc--) _();
return 0;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
477 ms |
120064 KB |
Execution killed with signal 13 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
516 ms |
118728 KB |
Execution killed with signal 13 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
672 ms |
116896 KB |
Execution killed with signal 13 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
451 ms |
63680 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
422 ms |
63676 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |