AT_utpc2025_b.Binary Tree Counting

NOI/NOI+/CTSC

通过率:0%

AC君温馨提醒

该题目为【atcoder】题库的题目,您提交的代码将被提交至atcoder进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

有 NN 个顶点,编号为 1,2,…,N1, 2, \dots, N,请你求满足以下所有条件的二叉树的个数,并将答案对 998244353998244353 取模:

  • 对于每个 i=1,2,…,Ni = 1, 2, \dots, N,顶点 ii 的先序遍历编号为 ii。特别地,顶点 11 是根节点。
  • 对于每个 i=1,2,…,Mi = 1, 2, \dots, M,顶点 AiA_i 的中序遍历编号为 BiB_i。

这里,当存在某个顶点 vv 满足以下任一条件时,认为两棵二叉树不同:

  • vv 的左儿子是否存在或其顶点编号不同。
  • vv 的右儿子是否存在或其顶点编号不同。

二叉树定义如下:每个顶点至多有一个左儿子和至多有一个右儿子的有根树。

关于先序遍历和中序遍历,定义如下。对于任一顶点 vv,其在先序、中序遍历中的编号分别在以下伪代码中 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 的右儿子)

输入格式

输入格式如下,通过标准输入读入:

NN MM A1A_1 B1B_1 A2A_2 B2B_2 ⋮\vdots AMA_M BMB_M

输出格式

输出一行,表示满足条件的二叉树个数对 998244353998244353 取模的结果。

输入输出样例

  • 输入#1

    3 1
    2 1

    输出#1

    2
  • 输入#2

    5 3
    1 3
    2 5
    4 2

    输出#2

    0
  • 输入#3

    30 6
    12 26
    9 5
    15 14
    19 15
    4 2
    10 4

    输出#3

    550222816

说明/提示

样例解释 1

有以下两棵满足条件的二叉树:

  • 顶点 11 为根,顶点 22 是顶点 11 的左儿子,顶点 33 是顶点 22 的右儿子。对此二叉树,
    • 顶点 11 的先序编号是 11,中序编号是 33。
    • 顶点 22 的先序编号是 22,中序编号是 11。
    • 顶点 33 的先序编号是 33,中序编号是 22。
  • 顶点 11 为根,顶点 22 是顶点 11 的左儿子,顶点 33 是顶点 11 的右儿子。对此二叉树,
    • 顶点 11 的先序编号是 11,中序编号是 22。
    • 顶点 22 的先序编号是 22,中序编号是 11。
    • 顶点 33 的先序编号是 33,中序编号是 33。

样例解释 2

不存在符合条件的二叉树。

数据范围

  • 输入均为整数。
  • 1≤M≤N≤5001 \leq M \leq N \leq 500
  • 1≤Ai,Bi≤N1 \leq A_i, B_i \leq N
  • Ai≠Aj (i≠j)A_i \neq A_j\ (i \neq j)
  • Bi≠Bj (i≠j)B_i \neq B_j\ (i \neq j)

由 ChatGPT 5 翻译

输入解题思路,AI测评打分。不知道怎么写?

首页