AT_utpc2025_b Binary Tree Counting
题目描述
有 $N$ 个顶点,编号为 $1, 2, \dots, N$,请你求满足以下所有条件的二叉树的个数,并将答案对 $998244353$ 取模:
- 对于每个 $i = 1, 2, \dots, N$,顶点 $i$ 的**先序遍历编号**为 $i$。特别地,顶点 $1$ 是根节点。
- 对于每个 $i = 1, 2, \dots, M$,顶点 $A_i$ 的**中序遍历编号**为 $B_i$。
这里,当存在某个顶点 $v$ 满足以下任一条件时,认为两棵二叉树不同:
- $v$ 的左儿子是否存在或其顶点编号不同。
- $v$ 的右儿子是否存在或其顶点编号不同。
二叉树定义如下:每个顶点至多有一个左儿子和至多有一个右儿子的有根树。
关于先序遍历和中序遍历,定义如下。对于任一顶点 $v$,其在先序、中序遍历中的编号分别在以下伪代码中 `dfs(根)` 执行时得到 `preorder[v]` 与 `inorder[v]` 的值:
```
pre_cnt = 1; in_cnt = 1
def dfs(v):
preorder[v] = pre_cnt; pre_cnt += 1
if v 的左儿子存在:
dfs(v 的左儿子)
inorder[v] = in_cnt; in_cnt += 1
if v 的右儿子存在:
dfs(v 的右儿子)
```
输入格式
输入格式如下,通过标准输入读入:
> $N$ $M$ $A_1$ $B_1$ $A_2$ $B_2$ $\vdots$ $A_M$ $B_M$
输出格式
输出一行,表示满足条件的二叉树个数对 $998244353$ 取模的结果。
说明/提示
### 样例解释 1
有以下两棵满足条件的二叉树:
- 顶点 $1$ 为根,顶点 $2$ 是顶点 $1$ 的左儿子,顶点 $3$ 是顶点 $2$ 的右儿子。对此二叉树,
- 顶点 $1$ 的先序编号是 $1$,中序编号是 $3$。
- 顶点 $2$ 的先序编号是 $2$,中序编号是 $1$。
- 顶点 $3$ 的先序编号是 $3$,中序编号是 $2$。
- 顶点 $1$ 为根,顶点 $2$ 是顶点 $1$ 的左儿子,顶点 $3$ 是顶点 $1$ 的右儿子。对此二叉树,
- 顶点 $1$ 的先序编号是 $1$,中序编号是 $2$。
- 顶点 $2$ 的先序编号是 $2$,中序编号是 $1$。
- 顶点 $3$ 的先序编号是 $3$,中序编号是 $3$。
### 样例解释 2
不存在符合条件的二叉树。
### 数据范围
- 输入均为整数。
- $1 \leq M \leq N \leq 500$
- $1 \leq A_i, B_i \leq N$
- $A_i \neq A_j\ (i \neq j)$
- $B_i \neq B_j\ (i \neq j)$
由 ChatGPT 5 翻译