ABC267F 题解
DaiRuiChen007 · · 题解
ABC267F 题解
思路分析
考虑对于每个点
注意到对于
求
时间复杂度
代码呈现
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+1;
vector <int> edge[MAXN],query[MAXN];
int ans[MAXN],node[MAXN],dis[MAXN],len;
inline void dfs(int p,int f,int dep) {
node[dep]=p;
for(int q:query[p]) if(dep>=dis[q]) ans[q]=node[dep-dis[q]];
len=max(len,dep);
for(int v:edge[p]) if(v!=f) dfs(v,p,dep+1);
}
signed main() {
int n,q;
scanf("%d",&n);
for(int i=1;i<n;++i) {
int u,v;
scanf("%d%d",&u,&v);
edge[u].push_back(v);
edge[v].push_back(u);
}
scanf("%d",&q);
for(int i=1;i<=q;++i) {
int u;
scanf("%d%d",&u,&dis[i]);
query[u].push_back(i);
}
for(int turn:{0,1,2}) {
int pos=node[len]; len=0;
if(!turn) pos=1;
dfs(pos,0,0);
}
for(int i=1;i<=q;++i) printf("%d\n",ans[i]?ans[i]:-1);
return 0;
}