dfs序可以\(O(1)\)判断书上两个点的从属关系

Tree Queries

题面翻译

给你一个以\(1\)为根的有根树.

每回询问\(k\)个节点\({v_1, v_2 \cdots v_k}\)

求出是否有一条以根节点为一端的链使得询问的每个节点到此链的距离均\(\leq 1\).

只需输出可行性, 无需输出方案.

题目描述

You are given a rooted tree consisting of\(n\)vertices numbered from\(1\)to\(n\). The root of the tree is a vertex number\(1\).

A tree is a connected undirected graph with\(n-1\)edges.

You are given\(m\)queries. The\(i\)-th query consists of the set of\(k_i\)distinct vertices\(v_i[1], v_i[2], \dots, v_i[k_i]\). Your task is to say if there is a path from the root to some vertex\(u\)such that each of the given\(k\)vertices is either belongs to this path or has the distance\(1\)to some vertex of this path.

输入格式

The first line of the input contains two integers\(n\)and\(m\)(\(2 \le n \le 2 \cdot 10^5\),\(1 \le m \le 2 \cdot 10^5\)) — the number of vertices in the tree and the number of queries.

Each of the next\(n-1\)lines describes an edge of the tree. Edge\(i\)is denoted by two integers\(u_i\)and\(v_i\), the labels of vertices it connects\((1 \le u_i, v_i \le n, u_i \ne v_i\)).

It is guaranteed that the given edges form a tree.

The next\(m\)lines describe queries. The\(i\)-th line describes the\(i\)-th query and starts with the integer\(k_i\)(\(1 \le k_i \le n\)) — the number of vertices in the current query. Then\(k_i\)integers follow:\(v_i[1], v_i[2], \dots, v_i[k_i]\)(\(1 \le v_i[j] \le n\)), where\(v_i[j]\)is the\(j\)-th vertex of the\(i\)-th query.

It is guaranteed that all vertices in a single query are distinct.

It is guaranteed that the sum of\(k_i\)does not exceed\(2 \cdot 10^5\)(\(\sum\limits_{i=1}^{m} k_i \le 2 \cdot 10^5\)).

输出格式

For each query, print the answer — "YES", if there is a path from the root to some vertex\(u\)such that each of the given\(k\)vertices is either belongs to this path or has the distance\(1\)to some vertex of this path and "NO" otherwise.

样例 #1

样例输入 #1

10 6
1 2
1 3
1 4
2 5
2 6
3 7
7 8
7 9
9 10
4 3 8 9 10
3 2 4 6
3 2 1 5
3 4 8 2
2 6 10
3 5 4 7

样例输出 #1

YES
YES
YES
YES
NO
NO

提示

The picture corresponding to the example:

Consider the queries.

The first query is\([3, 8, 9, 10]\). The answer is "YES" as you can choose the path from the root\(1\)to the vertex\(u=10\). Then vertices\([3, 9, 10]\)belong to the path from\(1\)to\(10\)and the vertex\(8\)has distance\(1\)to the vertex\(7\)which also belongs to this path.

The second query is\([2, 4, 6]\). The answer is "YES" as you can choose the path to the vertex\(u=2\). Then the vertex\(4\)has distance\(1\)to the vertex\(1\)which belongs to this path and the vertex\(6\)has distance\(1\)to the vertex\(2\)which belongs to this path.

The third query is\([2, 1, 5]\). The answer is "YES" as you can choose the path to the vertex\(u=5\)and all vertices of the query belong to this path.

The fourth query is\([4, 8, 2]\). The answer is "YES" as you can choose the path to the vertex\(u=9\)so vertices\(2\)and\(4\)both have distance\(1\)to the vertex\(1\)which belongs to this path and the vertex\(8\)has distance\(1\)to the vertex\(7\)which belongs to this path.

The fifth and the sixth queries both have answer "NO" because you cannot choose suitable vertex\(u\).

std

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+9;
int n,m;
int h[N],ver[N<<1],ne[N<<1],idx;
int dep[N],fa[N],dfn[N],sz[N],tim;
int k[N]; void add(int u,int v)
{
idx++,ver[idx] = v,ne[idx] = h[u];h[u] = idx;
} void dfs(int u,int pre)
{
fa[u] = pre,dfn[u] = ++tim,dep[u] = dep[pre]+1,sz[u] = 1;
for(int i = h[u];i;i= ne[i])
{
int v = ver[i];
if(v == pre)continue;
dfs(v,u);
sz[u] += sz[v];
}
} bool cmp(int x,int y){return dep[x] > dep[y];} int main()
{
scanf("%d%d",&n,&m);
for(int i = 1;i < n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v),add(v,u);
} dfs(1,1); while(m--)
{
int t;
scanf("%d",&t);
for(int i = 1;i <= t;i++)scanf("%d",&k[i]),k[i] = fa[k[i]];
sort(k+1,k+1+t,cmp);
bool flag = 1;
for(int i = 1;i < t;i++)
{
if(dfn[k[i]] > dfn[k[i+1]]+sz[k[i+1]]-1 || dfn[k[i]] < dfn[k[i+1]])
{
flag = 0;
break;
}
}
if(flag)printf("YES\n");
else printf("NO\n");
} return 0;
}

dfs 序的更多相关文章

  1. BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 1280 MBSubmit: 3127  Solved: 795[Submit][Status][Discu ...

  2. BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1352  Solved: 780[Submit][Stat ...

  3. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  4. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

  5. 【BZOJ-1146】网络管理Network DFS序 + 带修主席树

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 3495  Solved: 1032[Submi ...

  6. 【Codeforces163E】e-Government AC自动机fail树 + DFS序 + 树状数组

    E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...

  7. 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序

    3881: [Coci2015]Divljak Time Limit: 20 Sec  Memory Limit: 768 MBSubmit: 508  Solved: 158[Submit][Sta ...

  8. 2016 ACM/ICPC Asia Regional Dalian Online 1010 Weak Pair dfs序+分块

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...

  9. DFS序+线段树 hihoCoder 1381 Little Y's Tree(树的连通块的直径和)

    题目链接 #1381 : Little Y's Tree 时间限制:24000ms 单点时限:4000ms 内存限制:512MB 描述 小Y有一棵n个节点的树,每条边都有正的边权. 小J有q个询问,每 ...

  10. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

随机推荐

  1. java 类名后加变量名是什么意思?

    回答这个问题我们需要先了解两个事情: A是一个类,我们如果对他进行实例化,需要这样写: A a = new A(); 详细解释一下这个语句,首先等号左边做的事情:在JVM栈内存(stack)中定义了一 ...

  2. Erda 开源的迷失和反思

    前言 Erda 是我从2018年初加入上家公司直到今年初离开的四年时间里一直在做的一个云原生 PaaS 平台.在开源之前,Erda 在公司内部的名字代号是 D ,在21年初改名为现在的 Erda 进行 ...

  3. 一文读懂,硬核 Apache DolphinScheduler3.0 源码解析

    ​ 点亮 ️ Star · 照亮开源之路 https://github.com/apache/dolphinscheduler 本文目录 1 DolphinScheduler的设计与策略 1.1 分布 ...

  4. day01-项目开发流程

    多用户即时通讯系统01 1.项目开发流程 2.需求分析 用户登录 拉取在线用户列表 无异常退出(包括客户端和服务端) 私聊 群聊 发文件 服务器推送新闻/广播 3.设计阶段 3.1界面设计 用户登录: ...

  5. Django ORM 事务和查询优化

    一.事务操作 模块 from django.db import transaction 1 开启事务:with transaction.atomic() from django.db import t ...

  6. 基于 Apache Hudi + Presto + AWS S3 构建开放Lakehouse

    认识Lakehouse 数据仓库被认为是对结构化数据执行分析的标准,但它不能处理非结构化数据. 包括诸如文本.图像.音频.视频和其他格式的信息. 此外机器学习和人工智能在业务的各个方面变得越来越普遍, ...

  7. 几篇关于MySQL数据同步到Elasticsearch的文章---第二篇:canal 实现Mysql到Elasticsearch实时增量同步

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484377&idx=1&sn=199bc88 ...

  8. 记录一个奇葩的问题:k8s集群中master节点上部署一个单节点的nacos,导致master节点状态不在线

    情况详细描述; k8s集群,一台master,两台worker 在master节点上部署一个单节点的nacos,导致master节点状态不在线(不论是否修改nacos的默认端口号都会导致master节 ...

  9. flutter系列之:查询设备信息的利器:MediaQuery

    目录 简介 MediaQuery详解 MediaQuery的属性 MediaQuery的构造函数 MediaQuery的使用 总结 简介 移动的开发中,大家可能最头疼的就是不同设备的规格了,现在设备这 ...

  10. sql内连查询

    select <查询的列名> from <表名> inner join `<连接的表名称>` on <第一张表的主键> = <第二张表的外键> ...