2023 NOI 春季测试自测

题目 A. 涂色游戏 B. 幂次 C. 圣诞树 D. 密码锁
Time limit 1000ms 1000ms 1000ms 2500ms
Memory limit 512MiB 1024MiB 1024MiB 512MiB
输入输出 传统题 传统题 传统题 传统题

A. 涂色游戏

传统题 1000ms 512MiB

题目描述

有一天,小 D 在刷朋友圈时看到了一段游戏视频。

这个游戏的名字叫涂色游戏,视频中的游戏界面是一个 nnmm 列的网格,初始时每一个格子都是白色(用数字 00 表示)。其中每一行的左侧、每一列的上方都有一把带颜色的刷子。玩家点击某个刷子后,这个刷子会将其右侧(或下方)的一整行(或一整列)涂上同一种颜色,该行(或该列)格子原有的颜色都会被覆盖成新涂上的颜色。

下图展示的情况可以通过先将第一列涂成红色,然后将第一行涂成蓝色得到,若此时选择将第三列涂成绿色,则图中绿色方框中的格子都会变成绿色。

小 D 想用他自己编写的程序来进行视频中的游戏。在编程的过程中,小 D 在涂色逻辑的实现上却遇到了一些困难,于是他向你求助,希望你能帮他完成实现涂色逻辑部分的代码。

首先,小 D 会给你网格的行数和列数 n,mn, m,然后给出 qq 次操作,每次操作用三个整数 opti,xi,ciopt_i, x_i, c_i 表示:

  • 如果 opti=0opt_i=0,那么这次操作会将第 xix_i 涂成颜色 cic_i
  • 如果 opti=1opt_i=1,那么这次操作会将第 xix_i 涂成颜色 cic_i

在所有涂色操作结束以后,你需要输出网格中每个位置的颜色是什么。

输入格式

本题有多组测试数据。

第一行包含一个正整数 TT,表示数据组数。

接下来一共 TT 组数据,每组数据格式如下:

第一行包含三个整数 n,m,qn, m, q,分别表示涂色板的行数、列数,以及小 D 进行涂色操作的次数。

接下来 qq 行,每行包含三个整数 opti,xi,ciopt_i, x_i, c_i,表示一次操作。

输出格式

对于每组数据,输出 nn 行,每行 mm 个由单个空格隔开的整数。

其中第 ii 行第 jj 个整数表示涂色完成后网格中第 ii 行第 jj 列的方格是什么颜色。

样例 #1

样例输入 #1

2
5 5 9
1 5 1
0 4 0
1 4 1
0 3 0
1 3 1
0 2 0
1 2 1
0 1 0
1 1 1
3 3 3
0 1 2
0 3 1
1 1 3

样例输出 #1

1 0 0 0 0
1 1 0 0 0
1 1 1 0 0
1 1 1 1 0
1 1 1 1 1
3 2 2
3 0 0
3 1 1

提示

【样例 1 解释】

注意当一个格子没有被涂色时,其颜色为白色,用数字 00 表示。

【样例 2】

见选手目录下的 paint/paint2.in 与 paint/paint2.ans。

【数据范围】

对于所有数据,保证:

  • 1T101 \leq T \leq 101n,m1051 \leq n,m \leq 10^50q1050 \leq q \leq 10^50ci1090 \leq c_i \leq 10^9
  • opti=0opt_i=0,则 1xin1 \leq x_i \leq n;若 opti=1opt_i=1,则 1xim1 \leq x_i \leq m
  • 单个测试点中所有数据的 nmn \cdot m 的总和不超过 10610^6qq 的总和不超过 10610^6
测试点 nn \le mm \le qq \le 性质 A 性质 B
1 11 11 00
2 11
3 1010 2020
4 10510^5 ×
5
6 ×
7 1010 2020
8 5050 100100
9 ×
10 10001000 20002000 ×
11 ×
12
13 10510^5
14
15 10510^5
16
17 ×
18
19 ×
20

特殊性质 A:保证测试点中所有的 qmax(n,m)q \cdot \max(n, m) 之和不超过 10710^7

特殊性质 B:保证 opti=1opt_i = 1

【提示】

数据千万条,清空第一条。多测不清空,爆零两行泪。

B. 幂次

传统题 1000ms 1024MiB

题目描述

小 Ω 在小学数学课上学到了“幂次”的概念:a,bN+\forall a, b \in \N^+,定义 aba^bbbaa 相乘。

她很好奇有多少正整数可以被表示为上述 aba^b 的形式?由于所有正整数 mN+m \in N^+ 总是可以被表示为 m1m^1 的形式,因此她要求上述的表示中,必须有 bkb \geq k,其中 kk 是她事先选取好的一个正整数。

因此她想知道在 11nn 中,有多少正整数 xx 可以被表示为 x=abx = a^b 的形式,其中 a,ba, b 都是正整数,且 bkb \geq k

输入格式

第一行包含两个正整数 n,kn, k,意义如上所述。

输出格式

输出一行包含一个非负整数表示对应的答案。

样例 #1

样例输入 #1

99 1

样例输出 #1

99

样例 #2

样例输入 #2

99 3

样例输出 #2

7

样例 #3

样例输入 #3

99 2

样例输出 #3

12

提示

【样例 2 解释】

以下是全部 77 组符合题意的正整数及对应的一种合法的表示方法。

$1 = 1^3, 8 = 2^3, 16 = 2^4, 27 = 3^3, 32 = 2^5, 64 = 4^3, 81 = 3^4$

注意某些正整数可能有多种合法的表示方法,例如 6464 还可以表示为 64=2664 = 2^6

但根据题意,同一个数的不同的合法表示方法只会被计入一次。

【样例 3 解释】

以下是全部 1212 组符合题意的正整数及对应的一种合法的表示方法。

$1 = 1^2, 4 = 2^2, 8 = 2^3, 9 = 3^2, 16 = 4^2, 25 = 5^2, 27 = 3^3, 32 = 2^5, 36 = 6^2, 49 = 7^2, 64 = 8^2, 81 = 9^2$

【样例 4】

见选手目录下的 power/power4.in 与 power/power4.ans。

【样例 5】

见选手目录下的 power/power5.in 与 power/power5.ans。

【样例 6】

见选手目录下的 power/power6.in 与 power/power6.ans。

【数据范围】

对于所有数据,保证 1n10181 \leq n \leq 10^{18}1k1001 \leq k \leq 100

测试点编号 nn \le kk
1 10210^2 =1=1
2 2\ge 2
3 10410^4 3\ge 3
4 2\ge 2
5 10610^6 3\ge 3
6 2\ge 2
7 10810^8 3\ge 3
8 2\ge 2
9 101010^{10} 3\ge 3
10 2\ge 2
11 101210^{12} 3\ge 3
12 2\ge 2
13 101410^{14} 3\ge 3
14 2\ge 2
15 101610^{16} 3\ge 3
16 2\ge 2
17 101810^{18} 3\ge 3
18 2\ge 2
19
20

C. 圣诞树

传统题 1000ms 1024MiB

题目描述

众所周知,3202 年的圣诞节快要到了,因此小 Ω 买了一棵圣诞树和一根挂满了彩灯的电线,并打算把这根电线缠绕在圣诞树上。

圣诞树可以视作一个二维平面上有 nn 个顶点的凸多边形。这 nn 个顶点可以用于固定电线,且按逆时针顺序依次编号为 1,,n1, \cdots, n。其中第 ii 个顶点的坐标为 (xi,yi)(x_i, y_i),记其中 yy 坐标最大的顶点的编号为 kk(若有多个满足条件的顶点,则取编号最小的)。不保证编号为 11 的顶点的 xx 坐标最小。

下图左侧展示了一棵圣诞树的轮廓,其中 yy 坐标最大的顶点的编号为 k=5k = 5

图 2:一棵圣诞树及一种可能的挂电线的方案

小 Ω 希望用挂满了彩灯的电线装饰这棵圣诞树。出于美观性考虑,她希望这根电线经过所有顶点恰好一次;为了连接电源,这根电线需要(xk,yk)(x_k, y_k) 出发。形式化地,她需要决定一个 1,,n1, \cdots, n排列 p1,,pnp_1, \cdots, p_n,满足 p1=kp_1 = k,随后这根电线从 (xp1,yp1)(x_{p_1}, y_{p_1}) 出发,依次经过 (xp2,yp2),,(xpn,ypn)(x_{p_2}, y_{p_2}), \cdots, (x_{p_n}, y_{p_n})。此时,电线长度为 $\sum_{i=1}^{n-1}{\operatorname{d}((x_{p_i}, y_{p_i}), (x_{p_{i+1}}, y_{p_{i+1}}))}$。

  • 其中 d\operatorname{d} 为平面上的欧几里得距离,即 $\operatorname{d}((x, y), (x', y')) = \sqrt{(x - x')^2 + (y - y')^2}$。

上图右侧展示了一种可能的方案,此时对应的排列为 5,4,8,6,3,9,1,7,25, 4, 8, 6, 3, 9, 1, 7, 2

为了节省成本,她希望你能在所有可能的方案中,给出一种使电线长度最短的方案。如果使电线长度最短的方案不唯一,你只需要求出其中任意一种。

考虑到浮点数产生的误差,你输出的方案与最优方案的线段长度的相对误差或绝对误差不超过 101010^{-10} 时即认为答案正确

输入格式

第一行包含一个正整数 nn,表示圣诞树的顶点数。

接下来 nn 行,其中第 ii 行包含两个精确到小数点后 99 位的实数 xi,yix_i, y_i 表示编号为 ii 的顶点的坐标。

数据保证这 nn 个点两两不同,并且依次连接 (x1,y1),(x2,y2),,(xn,yn)(x_1, y_1), (x_2, y_2), \cdots, (x_n, y_n) 将形成一个凸多边形

输出格式

输出一行包含 nn 个由单个空格隔开的正整数 p1,p2,,pnp_1, p_2, \cdots, p_n,表示一个 1,,n1, \cdots, n 的排列,满足 p1=kp_1 = k,且电线的长度 $\sum_{i=1}^{n-1}{\operatorname{d}((x_{p_i}, y_{p_i}), (x_{p_{i+1}}, y_{p_{i+1}}))}$ 在所有可能的方案中最短。如果这样的方案不唯一,请输出其中任意一种方案。

样例 #1

样例输入 #1

3
0.000000000 0.000000000
3.000000000 0.000000000
1.000000000 1.000000000

样例输出 #1

3 1 2

提示

【样例 1 解释】

这一样例中只有下图所示的两种方案,对应排列分别为 3,1,23, 1, 23,2,13, 2, 1,电线长度分别为 3+23 + \sqrt{2}3+53 + \sqrt{5},而 3+2<3+53 + \sqrt{2} < 3 + \sqrt{5}

因此答案对应的排列为 3,1,23, 1, 2

图 3:样例 1 的全部两种可能的方案

【数据范围】

对于所有数据,保证 3n10003 \le n \le 1000xi,yi107|x_i|, |y_i| \le 10^7

测试点编号 nn \le 特殊性质
1, 2 44
3, 4, 5, 6 99
7, 8, 9, 10, 11, 12 1818
13, 14 10310^3 A
15, 16 B
17, 18, 19, 20

特殊性质 A:保证存在正整数 mnm \ge n,使得输入的 nn 个顶点对应正 mm 边形中连续的一段顶点。

特殊性质 B:保证 x1<x2<<xnx_1 < x_2 < \cdots < x_n,且 y1>y2>>yny_1 > y_2 > \cdots > y_n

D. 密码锁

传统题 2500ms 512MiB

题目描述

寒假过后,小 I 回到学校,发现自己忘记了自行车锁的密码,于是请你帮忙。

小 I 自行车上的密码锁有 nn 个拨圈,每个拨圈有 kkk4k \leq 4)格。密码锁上的每一格都包含一个正整数,其中第 jj 个拨圈的第 ii 格上的正整数为 ai,ja _ {i, j}

(一个锁的例子,其中 k=n=3k = n = 3,每列表示一个拨圈,拨圈的格子从上往下编号。)

你可以对每个拨圈拨若干次(也可以不拨),每拨一次拨圈,它的格子就会进行一次轮换。形式化地,拨第 jj 个拨圈一次,则会让第 jj 个拨圈上第 ii 格的数字移动到第 ((imodk)+1)((i \bmod k) + 1) 格,其他拨圈不动。

(一个拨动拨圈的例子,对左侧的锁拨一次第二个拨圈得到右侧的锁。)

为了方便记忆,小 I 设定密码时要求同一行上的数字尽可能靠近。 形式化地,对于 1ik1 \leq i \leq k,定义密码锁第 ii 行的松散度为

$$c(i) = \max \limits _ {j = 1} ^ n a _ {i, j} - \min \limits _ {j = 1} ^ n a _ {i, j} $$

同时定义整个密码锁的松散度为

C=max1ikc(i)C = \max \limits _ {1 \leq i \leq k} c(i)

因为能开锁的状态满足 CC 尽可能小,因此小 I 希望你找出最小的 CC 值。

输入格式

本题有多组测试数据,题目保证一个测试点中所有测试数据的 kk 相同。

第一行包含两个正整数 T,kT, k,分别表示测试数据组数和密码锁拨圈上的格数。

接下来一共 TT 组数据,每组数据格式如下:

第一行包含一个正整数 nn,表示拨圈数。

接下来 kk 行,每行包含 nn 个正整数,其中第 ii 行第 jj 个整数 ai,ja _ {i,j} 表示密码锁第 jj 个拨圈上第 ii 格对应的数字。

注意输入的矩阵中每一列对应一个拨圈,而非每一行对应一个拨圈。

输出格式

对于每组数据,输出一行包含一个整数,表示所有方案中 CC 的最小值。

样例 #1

样例输入 #1

2 3
3
1 2 1
2 3 2
3 1 3
2
1 2
2 1
1 2

样例输出 #1

0
1

样例 #2

样例输入 #2

见选手目录下的 lock/lock2.in。

样例输出 #2

见选手目录下的 lock/lock2.ans。

样例 #3

样例输入 #3

见选手目录下的 lock/lock3.in。

样例输出 #3

见选手目录下的 lock/lock3.ans。

样例 #4

样例输入 #4

见选手目录下的 lock/lock4.in。

样例输出 #4

见选手目录下的 lock/lock4.ans。

样例 #5

样例输入 #5

见选手目录下的 lock/lock5.in。

样例输出 #5

见选手目录下的 lock/lock5.ans。

提示

【样例 1 解释】

第一组样例对应题目描述中的例子。 在拨第二个拨圈一次后,每个拨圈都是 {1,2,3}\{1, 2, 3\},此时松散度为 00。 容易证明无论如何松散度都不可能小于 00,因此输出 00

以下四个样例分别对应 k=1,2,3,4k = 1, 2, 3, 4 的情况,且样例中 nn 的取值有一定梯度。

【数据范围】

n\sum n 为一个测试点中所有测试数据的 nn 的和。

对于所有数据,保证 1T1 \leq T1k41 \leq k \leq 41ai,j3×1041 \leq a _ {i ,j} \leq 3 \times 10 ^ 4

本题分为两类测试点。

第一类测试点共有十二个,保证 k3k \leq 3n5×104n \leq 5 \times 10 ^ 4n1.5×105\sum n \leq 1.5 \times 10 ^ 5

测试点编号 nn \leq n\sum n \leq k=k =
11 2020 100100 11
22 5×1045 \times 10 ^ 4 1.5×1051.5 \times 10 ^ 5
33 2020 100100 22
44 100100 10001000
55 20002000 10410 ^ 4
66 5×1045 \times 10 ^ 4 1.5×1051.5 \times 10 ^ 5
77 1010 5050 33
88 5050 500500
99 300300 30003000
1010 30003000 2×1042 \times 10 ^ 4
1111 3×1043 \times 10 ^ 4 1.2×1051.2 \times 10 ^ 5
1212 5×1045 \times 10 ^ 4 1.5×1051.5 \times 10 ^ 5

第二类测试点共有八个,保证 k=4k = 4n104n \leq 10 ^ 4n3×104\sum n \leq 3 \times 10 ^ 4

测试点编号 nn \leq n\sum n \leq k=k =
1313 1010 5050 44
1414 5050 500500
1515 200200 20002000
1616 500500 40004000
1717 25002500 10410 ^ 4
1818 50005000 2×1042 \times 10 ^ 4
1919 10410 ^ 4 3×1043 \times 10 ^ 4
2020

【后记】

你花了九牛二虎之力算出 CC 的值之后,小 I 却告诉你他已经找开锁师傅用锤子暴力破解了。在你的百般劝说下,小 I 承诺以后锁车不用有大于等于一万个拨圈的密码锁。