Codefroces 1328E Tree Querie(dfs序)
Codefroces 1328E Tree Querie
题目
给出一棵1为根,n个节点的树,每次询问\(k_i\) 个节点,问是否存在这样一条路径:
- 从根出发,且每个节点在这条路径上或者距离路径的距离为1
题解
由于是从根出发的路径,所以
- 距离这条路径的距离为1=这个点的父亲在路径上
- 本身就在根出发的这条路径上,当然这个点的父亲也在路径上
这样我们就把两个条件统一了,转化问题为:
是否存在一条从根出发的路径,使所有点都在这条路径上
根据从根出发的路径的特点,我们根据深度,从小到大排序,每次看后一个点是否在前一个节点的子树中就可以了
判断是否在子树中是非常经典的dfs序应用问题,先dfs一遍求出dfs序即可
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;
int head[maxn],cnt,vis[maxn],dep[maxn],L[maxn],R[maxn],xu,fa[maxn];
struct E
{
int nxt,to;
}edge[maxn*2+10];
struct P
{
int dep,id;
}a[maxn];
bool cmp(P x,P y)
{
return x.dep<y.dep;
}
void add_edge(int x,int y)
{
edge[++cnt].nxt=head[x];
edge[cnt].to=y;
head[x]=cnt;
}
void dfs(int x,int F)
{
L[x]=++xu;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].to;
if(v==F) continue;
dep[v]=dep[x]+1;
fa[v]=x;
dfs(v,x);
}
R[x]=xu;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
add_edge(x,y);
add_edge(y,x);
}
fa[1]=1;
dep[1]=1;
dfs(1,0);
for(int i=1;i<=m;i++){
int x;
scanf("%d",&x);
for(int j=1;j<=x;j++){
int y;
scanf("%d",&y);
a[j].id=fa[y];
a[j].dep=dep[a[j].id];
}
sort(a+1,a+x+1,cmp);
int Top=a[1].id;
int flag=1;
for(int j=2;j<=x;j++){
int v=a[j].id;
if(L[Top]<=L[v]&&L[v]<=R[Top]){
Top=v;
}
else{
flag=0;
break;
}
}
if(flag==1){
printf("YES\n");
}
else{
printf("NO\n");
}
}
}
Codefroces 1328E Tree Querie(dfs序)的更多相关文章
- Codeforces 343D Water Tree(DFS序 + 线段树)
题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...
- Codeforces 620E New Year Tree(DFS序 + 线段树)
题目大概说给一棵树,树上结点都有颜色(1到60),进行下面两个操作:把某结点为根的子树染成某一颜色.询问某结点为根的子树有多少种颜色. 子树,显然DFS序,把子树结点映射到连续的区间.而注意到颜色60 ...
- Codeforces Round #316 (Div. 2) D. Tree Requests dfs序
D. Tree Requests time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- POJ3321 Apple Tree(DFS序)
题目,是对一颗树,单点修改.子树查询.典型的dfs序入门题. DFS序可以将一颗树与子树们表示为一个连续的区间,然后用线段树来维护:感觉算是树链剖分的一种吧,和轻重链剖分不同的是这是对子树进行剖分的. ...
- POJ3321/Apple tree/(DFS序+线段树)
题目链接 Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9692 Accepted: 3217 Descr ...
- poj3321-Apple Tree(DFS序+树状数组)
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 36442 Accepted: 10894 Desc ...
- Codeforces 570D TREE REQUESTS dfs序+树状数组 异或
http://codeforces.com/problemset/problem/570/D Tree Requests time limit per test 2 seconds memory li ...
- 【bzoj1803】Spoj1487 Query on a tree III DFS序+主席树
题目描述 You are given a node-labeled rooted tree with n nodes. Define the query (x, k): Find the node w ...
- CoderForces343D:Water Tree(dfs序+线段树&&特殊处理)
Mad scientist Mike has constructed a rooted tree, which consists of n vertices. Each vertex is a res ...
随机推荐
- 赶紧收藏!王者级别的Java多线程技术笔记,我java小菜鸡愿奉你为地表最强!
Java多线程技术概述 介绍多线程之前要介绍线程,介绍线程则离不开进程. 首先 , 进程 :是一个正在执行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元: 线程:就 ...
- mysql 列转行 动态写法
-- 列转行动态sql -- 测试表DROP TABLE IF EXISTS `tb_score`; CREATE TABLE `tb_score` ( `id` int(11) NOT NULL A ...
- 惊天秘密!如何在 Flutter 项目中实现操作引导
不要冒然评价我,你只知道我的名字,却不知道我的故事,你只是听闻我做了什么,却不知我经历过什么. 俗话说得好,产品有三宝,弹窗浮层加引导. 上图截图自我司 App 晓黑板中的口算模块,相信每个 App ...
- js实现转盘抽奖
大转盘抽奖,主要通过css3的"transform:rotate(0deg)"属性来控制元素的旋转角度来实现. 通常,抽奖的过程需要渐进的效果,所以直接通过旋转属性写比较繁琐. 这 ...
- 20201203-6 设置excel样式【】
1-1 1 import os 2 from openpyxl import load_workbook 3 from openpyxl.styles import PatternFill, Alig ...
- Java后端使用socketio,实现小程序答题pk功能
在使用socket.io跟前端通信过程中,出现了一系列问题,现做下记录. 一.功能需求是,在小程序端,用户可相互邀请,进入房间后进行答题PK.实现方法是,用户点击邀请好友,建立连接,查询当前是否有房间 ...
- js上 十一、循环语句-2
11-1.跳转语句 在js中,有如下四种跳转语句: ü break ü continue break:结束本层循环 continue:跳过(结束)本次循环,继续进入下一次循环 就是两个关键字 #11- ...
- oranges 笔记第六章
OS 第六次实验随笔 第六章6.1-6.3相关的问题 进程状态保存与恢复 哪些状态 何时保存 保存在哪 如何恢复 特权级变换 用户进程到内核 内核回到用户进程 再次理解TSS .堆栈 从外环进入内环( ...
- [日常摸鱼]bzoj4802 欧拉函数-PollardRho大整数分解算法
啊居然要特判,卡了好久QAQ (好像Windows下的rand和Linux下的不一样? QwQ一些东西参考了喵铃的这篇blog:http://www.cnblogs.com/meowww/p/6400 ...
- 给小白整理的一篇Python知识点
1.基本概念 1.1 四种类型 python中数有四种类型:整数.长整数.浮点数和复数. python中数有四种类型:整数.长整数.浮点数和复数. 整数, 如 1 长整数 是比较大的整数 浮点数 如 ...