CF2002D2.DFS Checker (Hard Version)
提高+/省选-
通过率:0%
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
这是该问题的困难版本。在本版本中,给定的是一棵通用树,且 n 和 q 的约束更高。只有在两个版本都被解决的情况下,你才能进行 hack。
给定一棵有 n 个顶点的有根树,顶点编号为 1 到 n,根为顶点 1。同时给定一个 [1,2,…,n] 的排列 p1,p2,…,pn。
你需要回答 q 个询问。每个询问给定两个整数 x、y,你需要交换 px 和 py,并判断当前的 p1,p2,…,pn 是否为该树的一个合法 DFS 序。
请注意,交换操作在各个询问之间是持续生效的。
† DFS 序是通过对给定树调用如下 dfs 函数得到的。
dfs_order = []
function dfs(v):
append v to the back of dfs_order
pick an arbitrary permutation s of children of v
for child in s:
dfs(child)
dfs(1)
注意,DFS 序不是唯一的。
输入格式
每组测试包含多组测试用例。第一行包含测试用例数 t(1≤t≤104)。每组测试用例的描述如下。
每组测试用例的第一行包含两个整数 n、q(2≤n≤3⋅105,2≤q≤105),表示树的顶点数和询问数。
接下来一行包含 n−1 个整数 a2,a3,…,an(1≤ai<i),表示每个顶点的父节点。
接下来一行包含 n 个整数 p1,p2,…,pn(1≤pi≤n,所有 pi 互不相同),表示初始排列 p。
接下来的 q 行,每行包含两个整数 x、y(1≤x,y≤n,x=y),表示要交换排列中第 x 和第 y 个元素。
保证所有测试用例中 n 的总和不超过 3⋅105,所有 q 的总和不超过 105。
输出格式
对于每组测试用例的每个询问,输出一行。如果当前排列是该树的某个合法 DFS 序,输出 YES,否则输出 NO。
你可以以任意大小写输出 Yes 和 No(例如,yEs、yes、Yes 和 YES 都会被识别为正面回答)。
输入输出样例
输入#1
3 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 5 4 1 1 3 4 2 3 4 5 1 5 1 4 5 3 4 2 3
输出#1
YES YES NO YES NO NO YES YES NO NO YES
说明/提示
在第一个测试用例中,每次修改后的排列 p1,p2,…,pn 分别为 [1,3,2]、[1,2,3]、[3,2,1]。前两个排列是合法的 DFS 序,第三个不是。
在第二个测试用例中,每次修改后的排列 p1,p2,…,pn 分别为 [1,2,5,4,3,6,7]、[1,3,5,4,2,6,7]、[1,3,7,4,2,6,5]、[1,3,7,6,2,4,5]。
由 ChatGPT 4.1 翻译
输入解题思路,AI测评打分。不知道怎么写?