题意问,这个点的然后求子树的第i个节点。
这道题是个非常明显的DFS序:
我们只需要记录DFS的入DFS的时间,以及出DFS的时间,也就是DFS序,
然后判断第i个子树是否在这个节点的时间段之间。
最后用一个映射,把相应DFS序对应的节点编号写入。即可
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<vector> using namespace std; const int maxx = 2e5+7; vector<int>G[maxx]; int cnt=0; int st[maxx],ed[maxx],id[maxx]; void dfs(int x){ cnt++; st[x]=cnt;//DFS序 id[cnt]=x;//x对应的DFS序 for (int i=0;i<G[x].size();i++){ dfs(G[x][i]); } ed[x]=cnt;//x对应的DFS结束 } int main(){ int n,q; int tmp; scanf("%d%d",&n,&q); cnt=0; for (int i=2;i<=n;i++){ scanf("%d",&tmp); G[tmp].push_back(i); } dfs(1); int tmp2; while(q--){ scanf("%d%d",&tmp,&tmp2); if (st[tmp]+tmp2-1<=ed[tmp]){ printf("%d ",id[st[tmp]+tmp2-1]); }else { printf("-1 "); } } return 0; }