zoukankan      html  css  js  c++  java
  • 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
    ",id[st[tmp]+tmp2-1]);
        }else {
            printf("-1
    ");
        }
      }
      return 0;
    }
    有不懂欢迎咨询 QQ:1326487164(添加时记得备注)
  • 相关阅读:
    更改sql server数据库所有者的对象
    对C#委托及事件委托的理解
    印度人是怎样开发软件的?
    SQL常用函数
    Ajax学习1
    Ajax学习2
    什么是ORM?
    jQuery 移动网页到制定的位置
    Juery 控件的取值赋值
    js禁用滚动条
  • 原文地址:https://www.cnblogs.com/bluefly-hrbust/p/10537210.html
Copyright © 2011-2022 走看看