#jarch. 2026暑假CSP-J模拟赛03-T4 程老师的档案柜

2026暑假CSP-J模拟赛03-T4 程老师的档案柜

时间限制:1000ms 内存限制:512MB

题目描述

程老师的档案柜是一棵 nn 个节点的二叉树,节点编号 1n1 \sim n 互不相同。这棵树的每个节点都有值,但值的大小并不重要——重要的是节点之间的连接关系。

程老师在整理档案时,用两种不同的方式记录了这棵树的结构。第一种记录方式叫做前序遍历:先写下当前节点的编号,然后递归地写下左子树的所有节点,最后递归地写下右子树的所有节点。如果当前节点为空(没有节点),就什么都不写。

第二种记录方式叫做中序遍历:先递归地写下左子树的所有节点,然后写下当前节点的编号,最后递归地写下右子树的所有节点。如果当前节点为空,就什么都不写。

现在,程老师留下了这两份清单,但树本身已经找不到了。你需要根据这两份清单还原出树的结构,然后回答一些问题。

对于树中的每个节点,我们关心两个属性:

  1. 深度:从根节点到这个节点的路径上一共经过多少个节点(含根节点和该节点本身)。根节点的深度为 11
  2. 子树大小:以这个节点为根的子树中,包含多少个节点(包括这个节点本身)。

程老师会问你 qq 个问题,每个问题给你一个节点编号 vv,请你告诉他 vv 的深度和子树大小。

输入格式

第一行两个整数 nnqq,分别表示节点个数和询问次数。

第二行 nn 个整数,表示这棵树的前序遍历结果。

第三行 nn 个整数,表示这棵树的中序遍历结果。

接下来 qq 行,每行一个整数 vv,表示询问的节点编号。

输出格式

输出 qq 行,每行两个整数,用空格隔开,分别表示节点 vv 的深度和子树大小。

数据范围

  • 1n1051 \le n \le 10^5
  • 1q1051 \le q \le 10^5
  • 1vn1 \le v \le n
  • 两份清单保证是同一棵二叉树的前序与中序遍历结果。
测试点 nn \le qq \le 特殊性质
1 5
2~4 10 10
5~8 2000
9~10 10410^4 100 A
11~14 10510^5 10410^4
15~16 1 B
17~20 10510^5

特殊性质 A:树退化为一条链(每个节点至多有一个孩子)。

特殊性质 B:q=1q = 1

样例

样例 1

输入:

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

输出:

1 5
2 3
3 1
2 1

样例 2

输入:

1 1
1
1
1

输出:

1 1

样例 3

输入:

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

输出:

2 3
4 1

样例解释

样例 1:从两份清单可以还原出树的结构。前序遍历的第一个元素 1 是根节点。在中序遍历中找到 1,它左边的 4 2 5 构成了左子树,右边的 3 构成了右子树。对于左子树,前序遍历中紧接着的 2 4 5 是左子树的前序,所以 2 是左子树的根。在中序遍历中,2 左边的 4 是左子树,右边的 5 是右子树。这样就还原出了完整的树。

对于节点 1:它是根节点,深度为 1,子树包含所有 5 个节点。 对于节点 2:它是 1 的左孩子,深度为 2,子树包含节点 2、4、5 共 3 个。 对于节点 4:它是 2 的左孩子,深度为 3,子树只包含它自己。 对于节点 3:它是 1 的右孩子,深度为 2,子树只包含它自己。

样例 3:当每个节点只有右孩子时,前序遍历和中序遍历的结果相同,都是 1 2 3 4。此时树退化成一条链:1 → 2 → 3 → 4。

难度 提高
通过率 100%
尝试 2
已通过 2
ID
694
类型
传统题
Time Limit
1000ms
Memory Limit
512MiB
上传者

相关

在下列比赛中:

暑假CSP-J模拟赛 第3场