2019年信奥赛提高级第二轮试题(2019 CSP-S)

2019  CCF 非专业级软件能力认证第二轮提高级

2019 CCF CSP-S2

day1

2019年信奥赛提高级第二轮试题(2019 CSP-S)_第1张图片

 

注意事项与提醒(请选手务必仔细阅读)

1、文件名(程序名和输入输出文件名)必须使用英文小写。
2、C/C++ 中函数 main() 的返回值类型必须是 int,程序正常结束时的返回值必须是 0。
3、提交的程序代码文件的放置位置请参照各省的具体要求。
4、因违反以上三点而出现的错误或问题,申诉时一律不予受理。
5、若无特殊说明,结果的比较方式为全文比较(过滤行末空格及文末回车)。
6、程序可使用的栈内存空间限制与题目的内存限制一致。
7、全国统一评测时采用的机器配置为:Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz,内存 32GB。上述时限以此配置为准。
8、只提供 Linux 格式附加样例文件。
9、评测在当前最新公布的 NOI Linux 下进行,各语言的编译器版本以其为准。
最终评测时所用的编译命令中不含任何优化开关。
∑ 是求和运算符, n ai 的值等于 a1 + a2+   + an。
                          i=1


格雷码(code)

 

【题目描述】

通常,人们习惯将所有 n 位二进制串按照字典序排列,例如所有 2 位二进制串按字典序从小到大排列为:00,01,10,11。
格雷码(Gray Code)是一种特殊的 n 位二进制串排列法,它要求相邻的两个二进制串间恰.好.有一位不.同.,特别地,第一个串与最后一个串也算作相邻。
所有 2 位二进制串按格雷码排列的一个例子为:00,01,11,10。

位格雷码不止一种,下面给出其中一种格雷码的生成算法:
1、位格雷码由两个 1 位二进制串组成,顺序为:0,1。
2、+ 1 位格雷码的前 2n 个二进制串,可以由依此算法生成的 n 位格雷码(总共 2n 个 n 位二进制串)按顺序排列,再在每个串前加一个前缀 0 构成。
3、+ 1 位格雷码的后 2n 个二进制串,可以由依此算法生成的 n 位格雷码(总共 2n 个 n 位二进制串)按逆.序.排列,再在每个串前加一个前缀 1 构成。
综上,n + 1 位格雷码,由 n 位格雷码的 2n 个二进制串按顺序排列再加前缀 0,和按逆序排列再加前缀 1 构成,共 2n+1 个二进制串。另外,对于 n 位格雷码中的 2n 个二进制串,我们按上述算法得到的排列顺序将它们从 0 2n 1 编号。
按该算法,2 位格雷码可以这样推出:
已知 1 位格雷码为 0,1。
前两个格雷码为00,01。
后两个格雷码为11,10。合并得到 00,01,11,10,
编号依次为 0     3。
同理,3 位格雷码可以这样推出:
已知 2 位格雷码为:00,01,11,10。
前四个格雷码为:000,001,011,010。
后四个格雷码为:110,111,101,
100。合并得到:000,001,011,010,110,111,101,100,编号依次为 0   7。
现在给出 n; k,请你求出按上述算法生成的 n 位格雷码中的 k 号二进制串。

【输入格式】
从文件 code.in 中读入数据。
仅一行两个整数 n; k,意义见题目描述。

【输出格式】
输出到文件 code.out 中。
仅一行一个 n 位二进制串表示答案。

【样例 1 输入】
2 3
【样例 1 输出】
10
【样例 1 解释】
2 位格雷码为:00,01,11,10,编号从 0    3,因此 3 号串是 10。
【样例 2 输入】
3 5
【样例 2 输出】
111
【样例 2 解释】
3 位格雷码为:000,001,011,010,110,111,101,100,编号从 0 7,因此 5 号串是 111。
【样例 3】
见选手目录下的 code/code3.in  code/code3.ans

【数据范围】
对于 50% 的数据:n     10
对于 80% 的数据:k     5      106
对于 95% 的数据:k     263    1
对于 100% 的数据:1     n       64 , 0       k < 2n


 

括号树(brackets)

【题目背景】
本题中合法括号串的定义如下:
() 是合法括号串。
如果 A 是合法括号串,则 (A) 是合法括号串。
如果 A,B 是合法括号串,则 AB 是合法括号串。
本题中串与不同的子串的定义如下:

  • 字符串 S 的子串是 S 中连.续.的任意个字符组成的字符串。S 的子串可用起始位置 l 与终止位置 r 来表示,记为 S (l; r)(1 l r jS j,jS j 表示 S 的长度)。

  • S 的两个子串视作不同当且仅当它们在 S 中的位置不同,即 l 不同或 r 不同。

【题目描述】
一个大小为 n 的树包含 n 个结点和 n 1 条边,每条边连接两个结点,且任意两个结点间有且仅有一条简单路径互相可达。

  • Q 是一个充满好奇心的小朋友,有一天他在上学的路上碰见了一个大小为 n 的树,树上结点从 1 n 编号,1 号结点为树的根。除 1 号结点外,每个结点有一个父亲结点,u(2    u     n)号结点的父亲为 fu(1       fu < u)号结点。
    Q 发现这个树的每个结点上恰有.一个括号,可能是(或)。小 Q 定义 si 为:将根结点到 i 号结点的简单路径上的括号,按结点经过顺序依次排列组成的字符串。

显然 si 是个括号串,但不一定是合法括号串,因此现在小 Q 想对所有的(i1   i   n)
求出,si  中有多少个互不相同的子串是合法括号串。
这个问题难倒了小 Q,他只好向你求助。设 si 共有 ki 个不同子串是合法括号串,你只需要告诉小 Q 所有 i ki 的异或和,即:
(1     k1) xor (2     k2) xor (3      k3) xor           xor (n      kn)
其中 xor 是位异或运算。

【输入格式】
从文件 brackets.in 中读入数据。
第一行一个整数 n,表示树的大小。
第二行一个长为 n 的由(与)组成的括号串,第 i 个括号表示 i 号结点上的括号。
第三行包含 n    1 个整数,第 i(1   i < n)个整数表示 i + 1 号结点的父亲编号 fi+1。
【输出格式】
输出到文件 brackets.out 中。
仅一行一个整数表示答案。
【样例 1 输入】
5
(()()
1122
【样例 1 输出】
6
【样例 1 解释】
树的形态如下图:

2019年信奥赛提高级第二轮试题(2019 CSP-S)_第2张图片

将根到 1 号结点的简单路径上的括号,按经过顺序排列所组成的字符串为 (,子串是合法括号串的个数为 0。
将根到 2 号结点的简单路径上的括号,按经过顺序排列所组成的字符串为 ((,子串是合法括号串的个数为 0。
将根到 3 号结点的简单路径上的括号,按经过顺序排列所组成的字符串为 (),子串是合法括号串的个数为 1。
将根到 4 号结点的简单路径上的括号,按经过顺序排列所组成的字符串为 (((,子串是合法括号串的个数为 0。
将根到 5 号结点的简单路径上的括号,按经过顺序排列所组成的字符串为 ((),子串是合法括号串的个数为 1。

【样例 2】
见选手目录下的 brackets/brackets2.in  brackets/brackets2.ans
【样例 3】
见选手目录下的 brackets/brackets3.in  brackets/brackets3.ans

【数据范围】

2019年信奥赛提高级第二轮试题(2019 CSP-S)_第3张图片


树上的数(tree)

【题目描述】
给定一个大小为 n 的树,它共有 n 个结点与 n    1 条边,结点从 1   n 编号。初始时每个结点上都有一个 1     n 的数字,且每个 1    n 的数字都只在恰.好.一个结点上出现。
接下来你需要进行恰好1次删边操作,每次操作你需要选一条未被删去的边,此时这条边所连接的两个结点上的数字将会交换,然后这条边将被删去。
1 次操作过后,所有的边都将被删去。此时,按数字从小到大的顺序,将数字1 n 所在的结点编号依次排列,就得到一个结点编号的排列 Pi。现在请你求出,在最优操作方案下能得到的字.典.序.最.小.的 Pi。

2019年信奥赛提高级第二轮试题(2019 CSP-S)_第4张图片

如上图,蓝圈中的数字 1 5 一开始分别在结点 ⃝ 2、 ⃝ 1、 ⃝ 3、⃝ 5、⃝ 4。按照 (1)(4)(3)(2) 的顺序删去所有边,树变为下图。按数字顺序得到的结点编号排列为  ⃝ 1  ⃝  3 ⃝ 4 ⃝ 2⃝ 5,该排列是所有可能的结果中字典序最小的。

【输入格式】
从文件 tree.in 中读入数据。
本题输入包含多组测试数据。
第一行一个正整数 T ,表示数据组数。
对于每组测试数据:
第一行一个整数 n,表示树的大小。
第二行 n 个整数,第 i(1    i     n)个整数表示数字 i 初始时所在的结点编号。
接下来 n     1 行每行两个整数 x; y,表示一条连接 x 号结点与 y 号结点的边。
【输出格式】
输出到文件 tree.out 中。
对于每组测试数据,输出一行共 n 个用空格隔开的整数,表示最优操作方案下所能得到的字典序最小的 Pi。

【样例 1 输入】
4
5
21354
3
2 4
4 5
5
34215
2
3
3 4
4 5
5
12534
1 2
1 3
1 4
1 5
10
12345789106
1 2
1 3
1 4
1 5
5 6
6 7
7 8
8 9
9 10
【样例 1  输出】
13425
13524
23145
23456
178910
【样例 2】
见选手目录下的 tree/tree2.in  tree/tree2.ans

【数据范围】

2019年信奥赛提高级第二轮试题(2019 CSP-S)_第5张图片


2019  CCF 非专业级软件能力认证第二轮提高级

2019 CCF CSP-S2

day2

2019年信奥赛提高级第二轮试题(2019 CSP-S)_第6张图片

注意事项与提醒(请选手务必仔细阅读)

1、文件名(程序名和输入输出文件名)必须使用英文小写。
2、>C/C++ 中函数 main() 的返回值类型必须是 int,程序正常结束时的返回值必须是 0。
3、提交的程序代码文件的放置位置请参照各省的具体要求。
4、因违反以上三点而出现的错误或问题,申诉时一律不予受理。
5、若无特殊说明,结果的比较方式为全文比较(过滤行末空格及文末回车)。
6、程序可使用的栈内存空间限制与题目的内存限制一致。
7、全国统一评测时采用的机器配置为:Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz,内存 32GB。上述时限以此配置为准。只提供 Linux 格式附加样例文件。评测在当前最新公布的 NOI Linux 下进行,各语言的编译器版本以其为准。
8、最终评测时所用的编译命令中不含任何优化开关。
∑ 是求和运算符, n ai 的值等于 a1 + a2 + + an。

                          i=1


Emiya 家今天的饭(meal)

【题目描述】
Emiya 是个擅长做菜的高中生,他共掌握 n 种烹. 饪. 方. 法. ,且会使用 m 种主. 要. 食. 材.
做菜。为了方便叙述,我们对烹饪方法从 1 ∼ n 编号,对主要食材从 1 ∼ m 编号。

Emiya 今天要准备一桌饭招待 Yazid 和 Rin 这对好朋友,然而三个人对菜的搭配
有不同的要求,更具体地,对于一种包含 k 道菜的搭配方案而言:
• Emiya 不会让大家饿肚子,所以将做至少一道菜 ,即 k ≥ 1
• Rin 希望品尝不同烹饪方法做出的菜,因此她要求每道菜的烹饪方法互不相同
• Yazid 不希望品尝太多同一食材做出的菜,因此他要求每种主要食材至多在一半的菜(即 ⌊k2⌋ 道菜)中被使用

– 这里的 ⌊x⌋ 为下取整函数,表示不超过 x 的最大整数

这些要求难不倒 Emiya,但他想知道共有多少种不同的符合要求的搭配方案。两种
方案不同,当且仅当存在至少一道菜在一种方案中出现,而不在另一种方案中出现。
Emiya 找到了你,请你帮他计算,你只需要告诉他符合所有要求的搭配方案数对质
数 998, 244, 353 取模的结果。

【输入格式】
从文件 meal.in 中读入数据。
第 1 行两个用单个空格隔开的整数 n, m。
第 2 行至第 n + 1 行,每行 m 个用单个空格隔开的整数,其中第 i + 1 行的 m 个
数依次为 ai,1, ai,2, . . . , ai,m。
【输出格式】
输出到文件 meal.out 中。
仅一行一个整数,表示所求方案数对 998, 244, 353 取模的结果。
【样例 1 输入】
2 3
1 0 1
0 1 1

【样例 1 输出】
3
【样例 1 解释】
由于在这个样例中,对于每组 i, j,Emiya 都最多只会做一道菜,因此我们直接通
过给出烹饪方法、主要食材的编号来描述一道菜。
符合要求的方案包括:
• 做一道用烹饪方法 1、主要食材 1 的菜和一道用烹饪方法 2、主要食材 2 的菜
• 做一道用烹饪方法 1、主要食材 1 的菜和一道用烹饪方法 2、主要食材 3 的菜
• 做一道用烹饪方法 1、主要食材 3 的菜和一道用烹饪方法 2、主要食材 2 的菜
因此输出结果为 3 mod 998, 244, 353 = 3。
需要注意的是,所有只包含一道菜的方案都是不符合要求的,因为唯一的主要食材
在超过一半的菜中出现,这不满足 Yazid 的要求。
【样例 2 输入】
3 3
1 2 3
4 5 0
6 0 0
【样例 2 输出】
190
【样例 2 解释】
Emiya 必须至少做 2 道菜。
做 2 道菜的符合要求的方案数为 100。
做 3 道菜的符合要求的方案数为 90。
因此符合要求的方案数为 100 + 90 = 190。
【样例 3 输入】
5 5
1 0 0 1 1
0 1 0 1 0
1 1 1 1 0
1 0 1 0 1
0 1 1 0 1
【样例 3 输出】
742
【样例 4】
见选手目录下的 meal/meal4.in 与 meal/meal4.ans。
【样例 5】
见选手目录下的 meal/meal5.in 与 meal/meal5.ans。

【数据范围】


划分(partition)

2048 年,第三十届 CSP 认证的考场上,作为选手的小明打开了第一题。这个题的样例有 n 组数据,数据从 1 n 编号,i 号数据的规模为 ai。
小明对该题设计出了一个暴力程序,对于一组规模为 u 的数据,该程序的运行时间为 u2。然而这个程序运行完一组规模为 u 的数据之后,它将在任何一组规模小于 u的数据上运行错误。样例中的 ai 不一定递增,但小明又想在不修改程序的情况下正确运行样例,于是小明决定使用一种非常原始的解决方案:将所有数据划分成若干个数据段,段内数据编号连续,接着将同一段内的数据合并成新数据,其规模等于段内原数据的规模之和小明将让新数据的规模能够递增。
也就是说,小明需要找到一些分界点 1   k1 < k2 <    < kp < n,使得

2019年信奥赛提高级第二轮试题(2019 CSP-S)_第7张图片

【输入格式】
从文件 partition.in 中读入数据。
由于本题的数据范围较大,部分测试点的
ai将在程序内生成。
第一行两个整数 n, type。n 的意义见题目描述,type 表示输入方式。
1. 若 type = 0,则该测试点的ai直接给出。输入文件接下来:第二行 n 个以空格
分隔的整数 ai,表示每组数据的规模。
2. 若 type = 1,则该测试点的 ai 将特殊生成,生成方式见后文。输入文件接下来:
第二行六个以空格分隔的整数 x, y,z, b1, b2, m。接下来 m 行中,第 i(1 ≤ i ≤ m)
行包含三个以空格分隔的正整数 pi, li,ri。
对于 type = 1 的 23 ∼ 25 号测试点,ai 的生成方式如下:
给定整数 x, y,z, b1, b2, m,以及 m 个三元组 (pi, li,ri)。
保证 n ≥ 2。若 n > 2,则 ∀3 ≤ i ≤ n,bi = (x × bi−1 + y × bi−2 + z) mod 230。
保证 1 ≤ pi ≤ n,pm = n。令 p0 = 0,则 pi 还满足 ∀0 ≤ i < m 有 pi < pi+1。
对于所有 1 ≤ j ≤ m,若下标值 i(1 ≤ i ≤ n)满足 pj−1 < i ≤ pj,则有

ai =(bi mod (rj − lj + 1))+ lj

上述数据生成方式仅是为了减少输入量大小,标准算法不依赖于该生 方式.。
【输出格式】
输出到文件 partition.out 中。
输出一行一个整数,表示答案。
【样例 1 输入】
5 0
5 1 7 9 9
【样例 1 输出】
247
【样例 1 解释】
最优的划分方案为 {5,1},{7},{9},{9}。由 5 + 1 ≤ 7 ≤ 9 ≤ 9 知该方案合法。
答案为 (5 + 1)2 + 72 + 92 + 92 = 247。
虽然划分方案 {5},{1},{7},{9},{9} 对应的运行时间比 247 小,但它不是一组合法
方案,因为 5 > 1。
虽然划分方案 {5},{1,7},{9},{9} 合法,但该方案对应的运行时间为 251,比 247 大。
【样例 2 输入】
10 0
5 6 7 7 4 6 2 13 19 9
【样例 2 输出】
1256
【样例 2 解释】
最优的划分方案为 {5},{6},{7},{7},{4,6,2},{13},{19,9}。
【样例 3 输入】
10000000 1
123 456 789 12345 6789 3
2000000 123456789 987654321
7000000 234567891 876543219
10000000 456789123 567891234
【样例 3 输出】
4972194419293431240859891640
【样例 4】
见选手目录下的 partition/partition4.in 与 partition/partition4.ans。
【样例 5】
见选手目录下的 partition/partition5.in 与 partition/partition5.ans。

【数据范围】

2019年信奥赛提高级第二轮试题(2019 CSP-S)_第8张图片
所有测试点满足:type ∈ {0, 1} , 2 ≤ n ≤ 4 × 107, 1 ≤ ai ≤ 109, 1 ≤ m ≤ 105,1 ≤ li ≤ ri ≤ 109, 0 ≤ x, y,z, b1, b2 < 230。


树的重心(centroid)

【题目描述】
小简单正在学习离散数学,今天的内容是图论基础,在课上他做了如下两条笔记:
1. 一个大小为 n 的树由 n 个结点与 n − 1 条无向边构成,且满足任意两个结点间有
且仅有一条简单路径。在树中删去一个结点及与它关联的边,树将分裂为若干个
子树;而在树中删去一条边(保留关联结点,下同),树将分裂为恰好两个子树。
2. 对于一个大小为 n 的树与任意一个树中结点 c,称 c 是该树的重心当且仅当在树
中删去 c 及与它关联的边后,分裂出的所有子树的大小均不超过⌊n2⌋(其中 ⌊x⌋
是下取整函数)。对于包含至少一个结点的树,它的重心只可能有 1 或 2 个。
课后老师给出了一个大小为 n 的树 S,树中结点从 1 ∼ n 编号。小简单的课后作业
是求出 S 单独删去每条边后,分裂出的两个子树的重心编号和之和。即:

2019年信奥赛提高级第二轮试题(2019 CSP-S)_第9张图片

【输入格式】
从文件 centroid.in 中读入数据。
本题输入包含多组测试数据。
第一行一个整数 T 表示数据组数。
接下来依次给出每组输入数据,对于每组数据:
第一行一个整数 n 表示树 S 的大小。
接下来 n − 1 行,每行两个以空格分隔的整数 ui, vi,表示树中的一条边 (ui, vi)。
【输出格式】
输出到文件 centroid.out 中。
共 T 行,每行一个整数,第 i 行的整数表示:第 i 组数据给出的树单独删去每条边
后,分裂出的两个子树的重心编号和之和。
【样例 1 输入】
2
5
1 2
2 3
2 4
3 5
7
1 2
1 3
1 4
3 5
3 6
6 7
【样例 1 输出】
32
56
【样例 1 解释】
对于第一组数据:
删去边 (1, 2),1 号点所在子树重心编号为 {1},2 号点所在子树重心编号为 {2, 3}。
删去边 (2, 3),2 号点所在子树重心编号为 {2},3 号点所在子树重心编号为 {3, 5}。
删去边 (2, 4),2 号点所在子树重心编号为 {2, 3},4 号点所在子树重心编号为 {4}。
删去边 (3, 5),3 号点所在子树重心编号为 {2},5 号点所在子树重心编号为 {5}。
因此答案为 1 + 2 + 3 + 2 + 3 + 5 + 2 + 3 + 4 + 2 + 5 = 32。
【样例 2】
见选手目录下的 centroid/centroid2.in 与 centroid/centroid2.ans。
【样例 3】
见选手目录下的 centroid/centroid3.in 与 centroid/centroid3.ans。
该数据满足特殊性质 A,具体信息见数据范围中的描述。
【样例 4】
见选手目录下的 centroid/centroid4.in 与 centroid/centroid4.ans。
该数据满足特殊性质 B,具体信息见数据范围中的描述。

【数据范围】

2019年信奥赛提高级第二轮试题(2019 CSP-S)_第10张图片

表中特殊性质一栏,两个变量的含义为存在一个 1 ∼ n 的排列 pi(1 ≤ i ≤ n),使得:
A:树的形态是一条链。即 ∀1 ≤ i < n,存在一条边 (pi, pi+1)。
B:树的形态是一个完美二叉树。即 ∀1 ≤ i ≤n−1
2 ,存在两条边 (pi, p2i) 与 (pi, p2i+1)。
对于所有测试点:1 ≤ T ≤ 5 , 1 ≤ ui, vi ≤ n。保证给出的图是一个树。

百度搜索(2020西安信奥赛集训营)

了解信奥赛历年真题、了解各高校加分政策、了解比赛时间、了解陕西学员获奖名单


你可能感兴趣的:(2019年信奥赛提高级第二轮试题(2019 CSP-S))