#CF2002D. DFS 检查器(简单版本)
DFS 检查器(简单版本)
D1. DFS 检查器(简单版本)
每次测试时间限制:2 秒
内存限制:512 兆字节
题目描述
这是该问题的简单版本。在此版本中,给定的树是一棵完美二叉树,并且 和 的限制较低。只有当两个版本的问题都解决后,你才能进行 Hack。
你有一棵由 个顶点组成的完美二叉树†。顶点编号为 到 ,根节点是顶点 。你还获得了一个排列 ,它是 的一个排列。
你需要回答 个查询。对于每个查询,你会得到两个整数 和 ;你需要交换 和 ,然后判断当前的 是否是给定树的一个合法 DFS 顺序‡。
请注意,查询中的交换是持久化的(即每次交换会保留到后续查询)。
定义
† 完美二叉树 是一棵以顶点 为根的树,其大小 ( 为正整数),并且每个顶点 ()的父节点是 。因此,该树的所有叶子节点到根的距离都是 。
‡ DFS 顺序 是通过在给定树上调用以下 dfs 函数得到的顺序:
dfs_order = []
function dfs(v):
将 v 追加到 dfs_order 末尾
选择 v 的子节点的一个任意排列 s
对于 s 中的每个子节点 child:
dfs(child)
dfs(1)
注意,DFS 顺序并不是唯一的。
输入格式
每个测试点包含多个测试用例。第一行包含测试用例数 ()。
每个测试用例的描述如下:
- 第一行包含两个整数 和 (,)—— 树的顶点数和查询数。保证 ,其中 为正整数。
- 接下来一行包含 个整数 ()—— 每个顶点的父节点。保证 。
- 接下来一行包含 个整数 (,所有 互不相同)—— 初始排列 。
- 接下来 行,每行包含两个整数 和 (,)—— 表示要交换排列中位置 和 上的元素。
保证所有测试用例的 之和不超过 ,所有 之和不超过 。
输出格式
对于每个测试用例,输出 行,对应 个查询。对于每个查询,如果当前排列存在一种 DFS 顺序恰好等于该排列,则输出 YES,否则输出 NO。
大小写不敏感,例如 yEs、yes、Yes、YES 都会被识别为肯定回答。
样例输入
2
3 3
1 1
1 2 3
2 3
3 2
1 3
7 4
1 1 2 2 3 3
1 2 3 4 5 6 7
3 5
2 5
3 7
4 6
样例输出
YES
YES
NO
YES
NO
NO
YES
样例解释
在第一个测试用例中,每次修改后的排列 依次为:
、、。
前两个排列是合法的 DFS 顺序,第三个不是。
在第二个测试用例中,每次修改后的排列 依次为:
、、、。