#P12547. [集训队互测 2024day4]世界沉睡童话

[集训队互测 2024day4]世界沉睡童话

嗨,小蝴蝶。

今天我还能在『很久很久以前』的那一页上看到你吗?

泠珞给了你一棵大小为 nn 的有标号有根树 TTTT 中的结点从 1n1\sim n 标号,其中标号为 Rt\text{Rt} 的结点是它的根。

在最初的时候,TT 的每个结点上写有一个 1n1\sim n 之间的整数,称作这个结点的点权。保证 nn 个结点的点权构成一个 1n1\sim n 的排列。设标号为 ii 的结点的点权是 aia_i,那么 a1ana_1\sim a_n 构成一个 1n1\sim n 的排列。

需要注意的是,对于 TT 中的每个非叶子结点 uuuu 的儿子 viv_i 之间都是有顺序的。设 uukk 个儿子,那么 uukk 个儿子从左到右依次称为 $\text{ch}(u,1),\text{ch}(u,2),\cdots\cdots,\text{ch}(u,k)$。

现在以 Rt\text{Rt} 为根 DFS 这棵树 TT。当访问到一个结点 uu 的时候,我们按照 $\text{ch}(u,1),\text{ch}(u,2),\cdots\cdots,\text{ch}(u,k)$ 的顺序,依次递归地 DFS 其未被访问过的 kk 个儿子结点。这个过程将会得到唯一的一个 DFS 序列 ss,其中 sis_i 表示第 ii 个被访问到的结点的标号是 sis_i

接下来你需要进行恰好 n1n-1 次删边操作,第 ii 次操作将会删去 si+1s_{i+1}si+1s_{i+1} 的父亲 Fa(si+1)\text{Fa}(s_{i+1}) 所连的边 (si+1,Fa(si+1))\big(s_{i+1},\text{Fa}(s_{i+1})\big)

在第 ii 次删边操作进行之前,你需要决定是否交换 si+1s_{i+1} 的点权与 Fa(si+1)\text{Fa}(s_{i+1}) 的点权。如果你选择交换,那么 asi+1a_{s_{i+1}}aFa(si+1)a_{\text{Fa}(s_{i+1})} 的值将会互换,然后 (si+1,Fa(si+1))\big(s_{i+1},\text{Fa}(s_{i+1})\big) 将被删去;否则 (si+1,Fa(si+1))\big(s_{i+1},\text{Fa}(s_{i+1})\big) 将被直接删去,不改变点权。

你一共需要做出 n1n-1 次选择,做出这 n1n-1 次选择的方案数共有 2n12^{n-1} 种。 当 n1n-1 条边尽数被删去以后,设 aia'_i 表示最终标号为 ii 的点的点权。我们定义集合 SS 为所有通过交换操作可以得到的最终点权的排列构成的集合。换言之,一个 1n1\sim n 的排列 pSp\in S 当且仅当存在至少一种做出选择的方案使得最终每个 aia'_i=pi=p_i

最后泠珞给了你一个 1n1\sim n 的排列 pp,你需要在下列三个小问中选择一个进行回答:

  • 11 小问:判定 pp 是否 S\in S
  • 22 小问:求出 ppSS 中的后继。即求出字典序大于 pp 并且 S\in S 的排列 qq 中,字典序最小的那一个。如果 SS 中存在字典序大于 pp 的排列 qq,你需要报告存在并输出字典序最小的那一个 qq;否则你只需要报告不存在。
  • 33 小问:求出 ppSS 中的排名。即求出一共有多少个排列 qSq\in S,满足 qq 的字典序小于 pp,对大质数 998244353998244353 取模。

输入格式

第一行两个整数 n,Rtn,\text{Rt},分别表示 TT 的大小和 TT 的根结点的标号。

第二行 nn 个整数 a1,a2,,ana_1,a_2,\cdots,a_n,依次表示初始时标号为 1,2,,n1,2,\cdots,n 的结点的点权。

接下来 nn 行,其中的第 ii 行描述标号为 ii 的结点:每行第一个整数 kk 表示标号为 ii 的结点的儿子个数。接下来 kk 个整数 $\text{ch}(i,1),\text{ch}(i,2),\cdots\cdots,\text{ch}(i,k)$,从左到右依次表示 ii 的第 1,2,,k1,2,\cdots,k 个儿子的标号。

最后一行 nn 个整数 p1,p2,,pnp_1,p_2,\cdots,p_n,表示泠珞给你的排列。

输出格式

本题使用 Special Judge。 你的输出必须包含恰好三行。其中:

  • 第一行表示第 11 小问的答案,应该是一个大写字符串 YES\texttt{YES} 或者 NO\texttt{NO}
  • 第二行表示第 22 小问的答案,应该是 nn1n1\sim n 之间的整数 q1,q2,,qnq_1,q_2,\cdots,q_n,并且 q1,q2,,qnq_1,q_2,\cdots,q_n 构成一个 1n1\sim n 的排列;但是如果 SS 中不存在字典序大于 pp 的排列 qq,你只需要输出一个整数 1-1
  • 第三行表示第 33 小问的答案,应该是一个 [0,998244352][0,998244352] 之间的整数。

如果你不想回答三个小问中的某个或者某些,也可以在对应的行输出一个小写字符串 no comment\texttt{no comment},表示不想回答这个小问。忽略行末空格,但不忽略文末回车。在第三行之后应该恰有一个回车。

在一个测试点中:

  • 如果你正确回答了第 11 小问,将获得该测试点满分 10%10\% 的分数;
  • 如果你正确回答了第 22 小问,无论第 11 小问是否回答、回答正确与否,都将获得该测试点满分 70%70\% 的分数;
  • 如果你正确回答了第 33 小问,无论第 1,21,2 小问是否回答、回答正确与否,都将获得该测试点满分 100%100\% 的分数。

注意不符合输出格式的输出将直接获得 00 分!正确的回答、错误的回答以及 no comment\texttt{no comment} 这三种输出都是符合输出格式的。 每个子任务的得分是该子任务中所有测试点得分的最小值。

样例 1

样例 1 输入

5 3
2 4 1 3 5
0
1 5
3 4 2 1
0
0
2 5 4 3 1

样例 1 输出

YES
3 4 2 1 5
9

样例 1 解释

以下按照字典序从小到大的顺序列出了 SS 中的 1616 个排列,每行一个排列:

    1 5 2 3 4
    2 1 4 3 5
    2 3 4 1 5
    2 4 1 3 5
    2 4 3 1 5
    2 5 1 3 4
    2 5 3 1 4
    2 5 4 1 3
    2 5 4 3 1
    3 4 2 1 5
    3 5 2 1 4
    4 1 2 3 5
    4 3 2 1 5
    4 5 2 1 3
    4 5 2 3 1

附加样例 1~10

见下发文件。

保证第 1,2,,101,2,\cdots,10 个附加样例分别满足子任务 1,2,,101,2,\cdots,10 的限制。

子任务

对于所有数据,保证 2n2×1052\leq n\leq2\times10^5nn 个结点的儿子信息确实描述了一棵树 TTa1ana_1\sim a_np1pnp_1\sim p_n 均构成一个 1n1\sim n 的排列。

以下是各子任务的具体情况以及特殊性质:

子任务编号 分值 n=n= 树的形态 特殊性质 子任务依赖
11 55 2020
22 8×1048\times10^4 完全二叉树 DFS 序 1n1\sim n
33 22
44 二叉树 DFS 序 1n1\sim n
55 1010 242\sim4
66 DFS 序 1n1\sim n 2,42,4
77 1515 161\sim6
88 1.2×1051.2\times10^5 171\sim7
99 1.6×1051.6\times10^5 181\sim8
1010 2×1052\times10^5 191\sim9
  • 『二叉树』:保证 TT 中每个结点的儿子个数都 2\leq2
  • 『完全二叉树』:保证 TT 与一棵大小同样为 nn 的完全二叉树同构,并且 Rt\text{Rt} 对应完全二叉树的根。
  • 『DFS 序 1n1\sim n』:按照题目描述中所述方法对 TT 进行 DFS,第 ii 个被访问到的结点一定是标号为 ii 的结点,即 si=is_i=i