http://codeforces.com/contest/1006/problem/E

题意:

就是给出n,m,共n个点[1,n],m次询问。第二行给出n-1个数a[i],2<=i<=n;a[i]表示i的父亲节点是a[i]。

按照题目给构建一棵树,每次询问,找到从一个结点u开始DFS到第k个的节点编号是多少,这样的点不存在时输出-1。

思路:

如果对每个查询都DFS一次,必超时

所以必须预处理

这里用vector存边,用son[i]表示编号为i的点自身+孩子结点的总个数 ,用rk[i]表示遍历次序为i的点的编号 ,用sa[i]表示编号为i的点遍历的次序

代码如下:

 #include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
//const double PI=acos(-1);
#define Bug cout<<"---------------------"<<endl
const int maxm=1e6+;
const int maxn=2e5+;
using namespace std; int n,m,u,k;
vector<int>vt[maxn];//存边
int son[maxn];//son[i]表示编号为i的点自身+孩子结点的总个数
int rk[maxn];//rk[i]表示遍历次序为i的点的编号
int sa[maxn];//sa[i]表示编号为i的点遍历的次序
int cnt;//遍历次序计数器 void dfs(int num)
{
++cnt;
rk[cnt]=num;
sa[num]=cnt;
int sum=;
for(vector<int>::iterator it=vt[num].begin();it!=vt[num].end();it++)
{
int v=*it;
dfs(v);
sum+=son[v];
}
son[num]=sum;
} int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=;i<=n;i++)
{
int t;
scanf("%d",&t);
vt[t].push_back(i);
}
dfs();//预处理
for(int i=;i<m;i++)
{
scanf("%d %d",&u,&k);
if(son[u]<k)//孩子数小于k
printf("-1\n");
else
printf("%d\n",rk[sa[u]+k-]);
}
return ;
}

tip:如果没说是从那个点开始,入度为0的点就为根结点;

-

CodeForces 1006E Military Problem(DFS,树的选择性遍历)的更多相关文章

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

    题意:建一颗以\(1\)为根结点的树,询问\(q\)次,每次询问一个结点,问该结点的第\(k\)个子结点,如果不存在则输出\(-1\). 题解:该题数据范围较大,需要采用dfs预处理的方法,我们从结点 ...

  2. Military Problem CodeForces 1006E (dfs序)

    J - Military Problem CodeForces - 1006E 就是一道dfs序的问题 给定一个树, 然后有q次询问. 每次给出u,k, 求以u为根的子树经过深搜的第k个儿子,如果一个 ...

  3. Codeforces 838B - Diverging Directions - [DFS序+线段树]

    题目链接:http://codeforces.com/problemset/problem/838/B You are given a directed weighted graph with n n ...

  4. Codeforces 570D TREE REQUESTS dfs序+树状数组 异或

    http://codeforces.com/problemset/problem/570/D Tree Requests time limit per test 2 seconds memory li ...

  5. Codeforces 464E #265 (Div. 1) E. The Classic Problem 主席树+Hash

    E. The Classic Problem http://codeforces.com/problemset/problem/464/E 题意:给你一张无向带权图,求S-T的最短路,并输出路径.边权 ...

  6. codeforces 570 D. Tree Requests 树状数组+dfs搜索序

    链接:http://codeforces.com/problemset/problem/570/D D. Tree Requests time limit per test 2 seconds mem ...

  7. CodeForces - 813C The Tag Game (树的dfs遍历)

    [传送门]http://codeforces.com/problemset/problem/813/C [题目大意]两个人玩游戏,一个人跑一个人追,轮流决策,可以走也可以不走.给你一棵树,想要从某个结 ...

  8. Codeforces 383C . Propagating tree【树阵,dfs】

    标题效果: 有一棵树,有两种操作模式对本树:1:表示为(1 x val),在NOx加在节点上val,然后x每个节点加上儿子- val.给每个儿子一个儿子在一起-(- val),加到没有儿子为止.2:表 ...

  9. codeforces 1076E Vasya and a Tree 【dfs+树状数组】

    题目:戳这里 题意:给定有n个点的一棵树,顶点1为根.m次操作,每次都把以v为根,深度dep以内的子树中所有的顶点(包括v本身)加x.求出最后每个点的值为多少. 解题思路:考虑到每次都只对点及其子树操 ...

随机推荐

  1. Mybatis实体类的映射文件中select,insert语句使用

    id:在命名空间中唯一的标识符,可以被用来引用这条语句. parameterType:设置传入这条语句的参数的数据类型,如int,String...... resultType:设置从这条语句中返回数 ...

  2. Python 自省指南

    原作者:Patrick K. O'Brien 什么是自省? 在日常生活中,自省(introspection)是一种自我检查行为.自省是指对某人自身思想.情绪.动机和行为的检查.伟大的哲学家苏格拉底将生 ...

  3. 大数据高可用集群环境安装与配置(04)——安装JAVA运行环境

    Hadoop运行在java环境,所以在安装Hadoop之前,需要安装好jdk 提前下载好jdk安装包(jdk-8u161-linux-x64.tar.gz),将它上传到指定的安装目录当中,然后运行安装 ...

  4. 用Spring中的ResponseEntity文件批量压缩下载

    我看了很多网上的demo,先生成ZIP压缩文件,然后再下载. 我这里是生成ZIP文件流 进行下载.(核心代码没多少,就是一些业务代码) @RequestMapping(value = "/& ...

  5. FreeImage库的学习和使用

    1.FreeImage_SetPixelColor x横轴方向 y纵轴方向 左下角是(0, 0)

  6. C++命名规范——谷歌规范

    1.文件命名规则 文件名全部小写,可以含下划线或连字符,按项目约定命名,且尽量保证文件名明确.比如: cmd_save_player_info_class.cc ,my_use_full_class. ...

  7. linux_c_tcp_example

    server #include <stdio.h> #include <stdlib.h> #include <string.h> #include <uni ...

  8. jquery关于Select元素的操作

    jQuery获取Select元素,并选择的Text和Value: $("#select_id").change(function(){//code...});           ...

  9. like not like 优化

    instr(title,’手册’)>0 相当于like instr(title,’手册’)=0 相当于not like 对于LIKE语句,我们可以使用instr函数来进行SQL调优

  10. [SDOI2016]游戏(树剖+李超树)

    趁着我把李超树忘个一干二净的时候来复习一下吧,毕竟马上NOI了. 题解:看着那个dis就很不爽,直接把它转换成深度问题,然后一条直线x->y,假设其lca为z,可以拆分成x->z和z-&g ...