QOJ.ac

QOJ

Time Limit: 5 s Memory Limit: 1024 MB Total points: 100

#7764. 世界沉睡童话

统计

嗨,小蝴蝶。

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

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

在最初的时候,$ T $ 的每个结点上写有一个 $ 1\sim n $ 之间的整数,称作这个结点的点权。保证 $ n $ 个结点的点权构成一个 $ 1\sim n $ 的排列。设标号为 $ i $ 的结点的点权是 $ a_i $,那么 $ a_1\sim a_n $ 构成一个 $ 1\sim n $ 的排列。

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

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

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

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

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

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

  • 第 $ 1 $ 小问:判定 $ p $ 是否 $ \in S $。
  • 第 $ 2 $ 小问:求出 $ p $ 在 $ S $ 中的后继。即求出字典序大于 $ p $ 并且 $ \in S $ 的排列 $ q $ 中,字典序最小的那一个。如果 $ S $ 中存在字典序大于 $ p $ 的排列 $ q $,你需要报告存在并输出字典序最小的那一个 $ q $;否则你只需要报告不存在。
  • 第 $ 3 $ 小问:求出 $ p $ 在 $ S $ 中的排名。即求出一共有多少个排列 $ q\in S $,满足 $ q $ 的字典序小于 $ p $,对大质数 $ 998244353 $ 取模。

输入格式

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

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

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

最后一行 $ n $ 个整数 $ p_1,p_2,\cdots,p_n $,表示泠珞给你的排列。

输出格式

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

  • 第一行表示第 $ 1 $ 小问的答案,应该是一个大写字符串 $ \texttt{YES} $ 或者 $ \texttt{NO} $;
  • 第二行表示第 $ 2 $ 小问的答案,应该是 $ n $ 个 $ 1\sim n $ 之间的整数 $ q_1,q_2,\cdots,q_n $,并且 $ q_1,q_2,\cdots,q_n $ 构成一个 $ 1\sim n $ 的排列;但是如果 $ S $ 中不存在字典序大于 $ p $ 的排列 $ q $,你只需要输出一个整数 $ -1 $;
  • 第三行表示第 $ 3 $ 小问的答案,应该是一个 $ [0,998244352] $ 之间的整数。

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

在一个测试点中:

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

注意不符合输出格式的输出将直接获得 $ 0 $ 分!正确的回答、错误的回答以及 $ \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 解释

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

    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,\cdots,10 $ 个附加样例分别满足子任务 $ 1,2,\cdots,10 $ 的限制。

子任务

对于所有数据,保证 $ 2\leq n\leq2\times10^5 $;$ n $ 个结点的儿子信息确实描述了一棵树 $ T $;$ a_1\sim a_n $,$ p_1\sim p_n $ 均构成一个 $ 1\sim n $ 的排列。

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

子任务编号分值$ n= $树的形态特殊性质子任务依赖
$ 1 $$ 5 $$ 20 $
$ 2 $$ 5 $$ 8\times10^4 $完全二叉树DFS 序 $ 1\sim n $
$ 3 $$ 5 $$ 8\times10^4 $完全二叉树$ 2 $
$ 4 $$ 5 $$ 8\times10^4 $二叉树DFS 序 $ 1\sim n $$ 2 $
$ 5 $$ 10 $$ 8\times10^4 $二叉树$ 2\sim4 $
$ 6 $$ 10 $$ 8\times10^4 $DFS 序 $ 1\sim n $$ 2,4 $
$ 7 $$ 15 $$ 8\times10^4 $$ 1\sim6 $
$ 8 $$ 15 $$ 1.2\times10^5 $$ 1\sim7 $
$ 9 $$ 15 $$ 1.6\times10^5 $$ 1\sim8 $
$ 10 $$ 15 $$ 2\times10^5 $$ 1\sim9 $
  • 『二叉树』:保证 $ T $ 中每个结点的儿子个数都 $ \leq2 $。
  • 『完全二叉树』:保证 $ T $ 与一棵大小同样为 $ n $ 的完全二叉树同构,并且 $ \text{Rt} $ 对应完全二叉树的根。
  • 『DFS 序 $ 1\sim n $』:按照题目描述中所述方法对 $ T $ 进行 DFS,第 $ i $ 个被访问到的结点一定是标号为 $ i $ 的结点,即 $ s_i=i $。
About Issues

We understand that our problem archive is not perfect. If you find any issues with the problem, including the statement, scoring configuration, time/memory limits, test cases, etc.

You may use this form to submit an issue regarding the problem. A problem moderator will review your issue and proceed it properly.

STOP! Before you submit an issue, please READ the following guidelines:

  1. This is not a place to publish a discussion, editorial, or requests to debug your code. Your issue will only be visible by you and problem moderators. Other users will not be able to view or reply your issues.
  2. Do not submit duplicated issues. If you have already submitted one, please wait for an moderator to review it. Submitting multiple issues will not speed up the review process and might cause your account to be banned.
  3. Issues must be filed in English or Chinese only.
  4. Be sure your issue is related to this problem. If you need to submit an issue regarding another problem, contest, category, etc., you should submit it to the corresponding page.

Active Issues 0

No issues in this category.

Closed/Resolved Issues 0

No issues in this category.