You are on page 1of 7

XJOI 模拟赛

JacderZhang

2021 年 10 月 4 日

题目名称 托卡塔 尼伯龙根 先人祭


题目类型 传统 传统 传统
目录 toccare nibelungen dziady
可执行文件名 toccare nibelungen dziady
输入文件名 toccare.in nibelungen.in dziady.in
输出文件名 toccare.out nibelungen.out dziady.out
每个测试点时限 1.0 秒 1.0 秒 1.0 秒
内存限制 256MB 512MB 256MB
测试点数目 10 20 20
测试点是否等分 是 是 是
提交源程序程序名

对于 C++ 语言 toccare.cpp nibelungen.cpp dziady.cpp

编译选项

对于 C++ 语言 -lm -O2 -std=c++14

【注意事项(请仔细阅读)】
1. 文件名(包括程序名和输入输出文件名)必须使用英文小写。

2. C++ 中函数 main() 的返回值类型必须是 int,值必须为 0。

3. 若无特殊说明,结果比较方式为忽略行末空格、文末回车后的全文比较

4. 程序可使用的栈空间大小与该题内存空间限制一致。

5. 在终端中执行命令 ulimit -s unlimited 可将当前终端下的栈空间限制放大,但你使用


的栈空间大小不应超过题目限制。

6. 若无特殊说明,输入文件与输出文件中同一行的相邻整数均使用一个空格分隔。

7. 输入文件中可能存在行末空格,请选手使用更完善的读入方式(例如 scanf 函数)避免出


错。

8. 使用 std::deque 等 STL 容器时,请注意其内存空间消耗。


托卡塔 (toccare)
【问题描述】

给定一棵 n 个点的树,每个点有一个权值 pi ,且 p1 · · · pn 构成一个 1 · · · n 的排列。


询问有多少个点集 {u1 , u2 , · · · , uk }(1 ≤ k ≤ n) 满足这些点构成联通块的个数不超过 m,
且 max1≤i≤k {pui } − min1≤i≤k {pui } + 1 = k。
两个点集被视为不同当且仅当存在一个点属于一个集合而不属于另一集合。

【输入格式】

从文件 toccare.in 中读入数据。


输入数据第一行包含两个正整数 n, m。
第二行包含 n 个正整数,表示排列 p。
接下来 n − 1 行,每行两个整数 u, v,表示 u 和 v 之间有一条边。

【输出格式】

输出到文件 toccare.out 中。
一行一个整数,表示答案。

【样例 1 输入】

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

【样例 1 输出】

1 6

【样例 1 解释】

合法的点集有 {1}, {2}, {3}, {1, 2}, {2, 3}, {1, 2, 3},共 6 种。

1
【样例 2】

见下发文件中的 toccare/toccare2.in 和 toccare/toccare2.out。


该样例与测试数据 3 ∼ 4 满足同样的约束条件。

【样例 3】

见下发文件中的 toccare/toccare3.in 和 toccare/toccare3.out。


该样例与测试数据 7 ∼ 8 满足同样的约束条件。

【测试点约束】

测试点编号 n≤ m= 特殊性质
1∼2 100 5 无
3∼4 500,000 1 树是一条链
5∼6 500,000 6 树是一条链
7∼8 500,000 1 无
9 ∼ 10 500,000 7 无

2
尼伯龙根 (nibelungen)
【问题描述】

给定长度为 n 的字符串 S 以及它的 m 个子串 s1 ∼ sm 。


定义字符串 si 是优美的,当且仅当不存在 j ∈ [1, m] 满足 si 是 sj 的真子串。
请你求出所有优美的 si 。
定义字符串 a 是 b 的真子串,当且仅当 a ̸= b,且可以通过删除 b 的一个前缀和一个后缀
(可以为空)得到 a。

【输入格式】

从文件 nibelungen.in 中读入数据。


输入数据第一行包含两个正整数 n, m。
第二行包含一个字符串 S。
接下来 m 行,第 i 行包含两个整数 li , ri ,表示 si 是字符串 S 第 li 个字符到第 ri 个字符
构成的子串。

【输出格式】

输出到文件 nibelungen.out 中。
一行一个长度为 m 的字符串 t,如果 si 是优美的,那么 ti = 1,否则 ti = 0。

【样例 1 输入】

1 7 3
2 abaabaa
3 1 4
4 2 6
5 5 7

【样例 1 输出】

1 110

【样例 1 解释】

s1 = abaa, s2 = baaba, s3 = baa,其中 s3 是 s2 的子串,所以优美的字符串有 s1 , s2 。

3
【样例 2】

见下发文件中的 nibelungen/nibelungen2.in 和 nibelungen/nibelungen2.out。


该样例与测试数据 4 ∼ 7 满足同样的约束条件。

【样例 3】

见下发文件中的 nibelungen/nibelungen3.in 和 nibelungen/nibelungen3.out。


该样例与测试数据 8 ∼ 12 满足同样的约束条件。

【测试点约束】

测试点编号 n≤ m≤
1∼3 400 400
4∼7 5,000 5,000
8 ∼ 12 300,000 5,000
13 ∼ 20 500,000 500,000

4
先人祭 (dziady)
【问题描述】

给定一张无向简单图,没有重边和自环,保证每条边属于最多一个简单环。
你可以进行如下两种操作:

1. 选择一个点 u,满足 u 的度数为奇数,删除所有与 u 相连的边。

2. 复制这张图,并在对应点之间连边。
形式化的,假设原图有 n 个点,m 条边,分别为 (u1 , v1 ), · · · , (um , vm ),那么新图中将有
如下 3 类边:

(a) (ui , vi )
(b) (ui + n, vi + n)
(c) (ui , ui + n)

请构造一个操作序列,使操作结束后,剩余的边数尽可能少。
由于操作 2 的代价非常大,你只能进行一次操作 2。
注意:你只需要最小化操作完后的剩余边数,不需要最小化操作次数。

【输入格式】

从文件 dziady.in 中读入数据。


输入数据第一行包含两个正整数 n, m,表示图的点数和边数。
接下来 m 行,每行两个整数 u, v,表示 u, v 之间有一条无向边。

【输出格式】

输到文件件 dziady.out 中。
第一行输出两个非负整数 m′ , k,表示操作完后剩下的边数和操作序列的长度。
接下来 k 行,每行表示一个操作:

1. 如果对点 u 使用第一种操作,输出“1 u”。

2. 如果使用第二种操作,输出“2”。

5
【样例 1 输入】

1 7 7
2 1 2
3 2 3
4 3 1
5 2 4
6 2 5
7 3 6
8 3 7

【样例 1 输出】

1 0 13
2 1 4
3 1 2
4 1 1
5 1 6
6 1 3
7 2
8 1 1
9 1 2
10 1 3
11 1 4
12 1 5
13 1 6
14 1 7

【测试点约束】

测试点编号 n≤ m≤ 特殊性质
1∼2 10 10 无
3∼4 300,000 450,000 保证每个点的度数为 2。
5∼7 300,000 450,000 保证图中每个点属于最多一个简单环。
8 ∼ 10 300,000 450,000 ∀u ∈ [2, n],点 u 的度数为 2
11 ∼ 20 300,000 450,000 无

You might also like