Codeforces Round #498 (Div. 3)--E. Military Problem

 题意问,这个点的然后求子树的第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\n",id[st[tmp]+tmp2-1]);
    }else {
        printf("-1\n");
    }
  }
  return 0;
}

 

posted @ 2019-03-15 15:10  bluefly-hrbust  阅读(145)  评论(0编辑  收藏  举报