#ABC478F. 最小值优先搜索 / Min-First Search

最小值优先搜索 / Min-First Search

题目描述

对于一棵有 NN 个顶点、分别称为顶点 11、顶点 22、…\ldots、顶点 NN 的树 TT,定义 f(T)f(T) 为按以下步骤得到的 (1,2,…,N)(1,2,\ldots,N) 的排列 PP。

  • 首先,令序列 PP 为空序列 ()(),令集合 SS 为 {1}\lbrace1\rbrace。
  • 重复以下操作 NN 次。
  • 令 xx 为 SS 中的最小值。从 SS 中删去 xx,并把 xx 追加到 PP 的末尾。
  • 然后,令 v1,v2,…,vkv_1, v_2, \ldots, v_k 为 TT 中与顶点 xx 相邻的顶点。对于 i=1,2,…,ki=1,2,\ldots,k,若 viv_i 不包含在 PP 中,则把 viv_i 加入 SS。

给定 (1,2,…,N)(1,2,\ldots,N) 的排列 Q=(Q1,Q2,…,QN)Q=(Q_1,Q_2,\ldots,Q_N)。请求出满足 f(T)=Qf(T)=Q 的树 TT 的个数模 998244353998244353 的值。这里,当存在一对顶点 (u,v)(u,v) 使得其中一棵树的顶点 uu 与顶点 vv 之间有边、而另一棵树中没有时,就认为这两棵树不同。

输入格式

输入按以下格式从标准输入读入:

  • NN
  • Q1Q_1 Q2Q_2 …\ldots QNQ_N

输出格式

输出满足 f(T)=Qf(T)=Q 的树 TT 的个数模 998244353998244353 的值。

5
1 3 4 2 5
8

例如,若 TT 为如下图所示的树,则 f(T)=Qf(T)=Q。

图示

求 f(T)f(T) 的步骤如下图所示。

图示

包含这棵树在内,共有如下图所示的 88 棵树满足条件。

图示

因此输出 8。

20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
868586527

输出满足条件的树的个数模 998244353998244353 的值。

30
1 16 23 14 18 10 12 21 27 30 17 28 4 9 20 13 22 11 19 3 25 26 6 7 2 8 5 24 15 29
910753763

数据范围

  • 1≤N≤2×1051\le N\le2\times10^5

  • 1≤Qi≤N (1≤i≤N)1\le Q_i\le N\ (1\le i\le N)

  • Qi≠Qj (1≤i<j≤N)Q_i\ne Q_j\ (1\le i\lt j\le N)

  • Q1=1Q_1=1

  • 输入均为整数。

  • 来源:AtCoder ABC 478 F

子任务设置

  • 子任务 1(30 分):N≤2000N \le 2000。
  • 子任务 2(30 分):N≤104N \le 10^4。
  • 子任务 3(40 分):无特殊限制。