PA的博客

博客

PA 2025 中文翻译

2025-03-10 19:22:27 By PA (Love 5331226 ver)

1C

任务:FIN

决赛选手 [C]

2025年算法竞赛,第一轮。限制:1024 MB,2秒。10.03.2025

今年,你决定终于进入算法竞赛的决赛!在你实现这一目标之前,最好先了解一下决赛的具体资格规则。在竞赛的规程中,你发现了以下几点: • 经过五轮线上比赛后,竞赛将会选出20名选手进入决赛。其中,排名A+B+C前十名的选手将占据其中十个名额。剩下的十个名额将由排名靠前的选手组成,排除那些至少两次参加过算法竞赛决赛的选手。 • 只有波兰国籍选手、波兰居民或在波兰学习、工作或居住的选手才能获得资格。 • 为了选出20名决赛选手,首先需要从排名中去除那些不符合资格的选手以及那些放弃参赛的选手。然后,在剩余选手中,按照上述规则选出20名决赛选手。

你的朋友非常了解所有参赛选手,并且预测了今年的排名。给了你一份包含n名选手的名单,选手编号从1到n,按成绩从高到低排列(名单中没有平局)。对于每个选手,你知道他们是否有资格并愿意参加决赛,以及他们之前参加过多少次决赛。

请你根据规则选出20名选手,按照规定的顺序列出他们的编号。

输入 • 第一行包含一个整数n(20 ≤ n ≤ 10,000),表示排名中的选手数量。 • 接下来的n行包含选手的信息。每一行包含一个字符串s和一个整数x(s ∈ {TAK, NIE}, 0 ≤ x < 20)。字符串TAK表示该选手愿意并能够参加决赛,字符串NIE表示该选手不能或不愿意参加决赛。数字x表示该选手此前参加决赛的次数。

输出 • 输出一行,包含20个以空格分隔的整数,表示成功进入决赛的选手编号,按升序排列。

示例

输入:

35
NIE 0
NIE 0
TAK 3
TAK 0
TAK 7
TAK 5
NIE 0
NIE 0
TAK 7
TAK 1
NIE 0
TAK 8
TAK 1
TAK 3
NIE 0
TAK 2
NIE 0
TAK 1
NIE 4
TAK 2
TAK 2
TAK 1
TAK 1
TAK 0
TAK 0
TAK 0
TAK 0
TAK 0
NIE 0
TAK 1
TAK 2
TAK 0
TAK 0
TAK 0
TAK 0

输出:

3 4 5 6 9 10 12 13 14 16 18 22 23 24 25 26 27 28 30 32

解释:

选手编号1、2、7、8、11、15、17、19、29被排除,因为他们不能或不愿参加决赛。剩下的10名最好的选手分别是编号3、4、5、6、9、10、12、13、14、16。然后,去除编号20、21和31的选手,因为他们已经至少参加过两次决赛,最终选出的第二组10名决赛选手的编号为:18、22、23、24、25、26、27、28、30、32。

备注:

你的朋友预测,编号23的选手将在决赛中获胜!

1B

任务:PRA 工作 [B] 算法对决 2025,第一轮。限制:1024 MB,2秒。2025年3月10日

算法对决开始了!不幸的是,Bajtazar不能忽视他的工作,他的职责不会因为对决周而神奇地消失。Bajtazar的一天可以分为n个时间段,每个时间段持续一个bajt小时。每个时间段的工作属于以下三类之一: 1. 办公室会议 2. 远程会议 3. 无责任

在一天内,Bajtazar可以在家里、办公室或两者之间的路上。Bajtazar的工作日从家里开始并结束,他最多可以去办公室一次,只要他能在第n个bajt小时之前返回家中。从家到办公室以及从办公室回家的时间恰好为t个bajt小时。根据他的当前位置,Bajtazar可以进行不同的活动: • 在家:Bajtazar当然不能参加办公室会议,但他可以(但不一定)参加远程会议,或者他可以解决算法对决的远程题目(但不能在开会时做题)。 • 在路上:Bajtazar不能参加任何会议,也不能做题——他必须专心开车(他没有雇司机)。 • 在办公室:Bajtazar可以参加任何类型的会议,除此之外他必须工作——不能做题。

你的任务是安排Bajtazar的一天,以最大化他解决问题的bajt小时数。然而,如果Bajtazar错过超过k个会议,他可能会被解雇。那时他来年的参赛资格,以及其他生活中的事情,都可能会受到影响——我们可不希望发生这种事。

Bajtazar非常有条理,所以在每个时间段内他只会专注于一项任务,特别是家和办公室之间的路程占用他正好t个连续的时间段。

输入 第一行包含三个整数n、k和t(3 ≤ n ≤ 8000,0 ≤ k ≤ n,1 ≤ t < n²),分别表示:时间段的数量、Bajtazar可以错过的会议数、以及从家到办公室单程的旅行时间(以bajt小时为单位)。 第二行是一个长度为n的字符串,由字符1、2或3组成,表示Bajtazar在每个时间段的任务类型。字符对应上文的类别编号。

输出 输出一个整数,表示Bajtazar能够在不超过错过k个会议的情况下,最多能用来做题的bajt小时数。如果无法在不超过错过k个会议的情况下完成,输出-1。

示例 输入1:

10 1 2
3233313132

输出1:

3

输入2:

7 0 2
3313233

输出2:

0

输入3:

6 5 1
231323

输出3:

6

输入4:

4 1 1
1331

输出4:

-1

示例解释: 在第一个示例中,在一个最优的解法中,Bajtazar的日程安排如下: 1. 解题 2. 远程会议(在家) 3. 解题 4. 路上去办公室 5. 路上去办公室 6. 办公室会议 7. 路上回家 8. 路上回家(错过了一个会议) 9. 解题 10. 远程会议(在家)

在这个计划中,Bajtazar错过了一个会议,并且在3个bajt小时内解决了题目。

在第二个示例中,唯一一个不失去工作且能够完成的计划如下: 1. 路上去办公室 2. 路上去办公室 3. 办公室会议 4. 办公室工作 5. 远程会议(从办公室) 6. 路上回家 7. 路上回家

在第三个示例中,Bajtazar可以整天在家解决题目,并且错过所有的远程会议。

在第四个示例中,Bajtazar无法参加任何办公室会议,因为他无法按时到达或按时返回家中。

1A

任务:TEL 瞬间传送 [A] 算法对决 2025,第一轮。限制:1024 MB,5秒。2025年3月10日

Bajtocja是一个由n个城市组成的国家(编号从1到n),这些城市通过双向高速公路连接。通过高速公路在两个城市之间行驶需要消耗一个bajtolit燃料。Bajtazar——BajtTrans公司的总裁,对燃料的消耗非常不满,因此他计划在Bajtocja的某两个城市之间设置一个双向传送门。通过传送门的旅行是瞬时的,并且不消耗燃料!BajtTrans公司的卡车必须拥有足够大的油箱,以便能够在一次加油后从任何一个城市出发,行驶到任何其他城市(不计算城市内消耗的燃料,忽略不计)。

Bajtazar希望最小化卡车油箱的大小。给定Bajtocja高速公路的描述,求出在最优选择传送门的情况下,所需的最小油箱容量。你可以假设,通过高速公路可以在每一对城市之间行驶。

你需要为t个独立的测试用例解决这个问题。

输入

第一行包含一个整数t (1 ≤ t ≤ 21),表示测试用例的数量。 每个测试用例的第一行包含一个整数n (3 ≤ n ≤ 400),表示Bajtocja的城市数量。 接下来的n行描述了Bajtocja的高速公路。每一行是一个长度为n的二进制字符串,第i个字符串的第j个元素为1,表示城市i和城市j之间有一条高速公路;否则为0。 • 每条高速公路连接两个不同的城市——第i行第i列的元素总是0。 • 每条高速公路是双向的——第i行第j列的元素与第j行第i列的元素相等。 使用这些描述的高速公路,可以在Bajtocja的每一对城市之间行驶。

所有测试用例的n值的总和不超过400。

输出

输出t行,每行包含一个整数,表示每个测试用例中,在最优设置传送门的情况下,所需的最小油箱容量(单位为bajtolit)。

示例

输入:

2
4
0111
1011
1101
1110
5
01000
10100
01010
00101
00010

输出:

1
2

示例解释:

在第一个测试用例中,每一对城市之间都可以直接通过高速公路连接,不论我们在哪两个城市之间设置传送门,仍然需要至少1个bajtolit的油箱。

在第二个测试用例中,如果油箱容量为2个bajtolit,我们仍然无法通过高速公路在城市对(1, 4),(1, 5)和(2, 5)之间行驶。然而,设置传送门(例如在城市1和城市5之间)后,就可以解决这个问题。

2C

以下是该题目的中文翻译:

题目名称:学校选址(SZK)

算法对抗赛 2025,第二轮。限制:内存 1024 MB,时间 2 秒。日期:2025年3月11日。

Algolina 和 Bajtazar 打算搬到 Byte 城镇,因此需要寻找新家。在 Byte 城镇中只有一条长长的道路,道路旁有编号从 1 到 n 的 n 座建筑物。其中一些建筑提供出租公寓,而另一些则已经住满(我们称这些建筑为“已占用”)。

已占用的建筑物可以用 m 个互不重叠的区间 [l_i, r_i] 来描述,这表示所有编号满足 l_i \leq x \leq r_i 的建筑物 x 都已占用。

Algolina 和 Bajtazar 在选择住所时考虑了很多因素,其中一个重要因素是住所与他们的儿子 Bajtek 未来就读学校的距离。该学校位于编号为 s 的建筑中(保证该建筑已经被占用)。

由于 Bajtek 年龄还小,父母不希望他上学路程太远。因此,他们希望找到距离学校最近的一座尚未占用的建筑物。假设建筑物之间的距离都是相等的,他们需要选择一个建筑物编号 p,使得 |s - p| 尽可能小。

输入格式

第一行包含三个整数 n, m, s (2 \leq n \leq 10^{12}, 1 \leq m \leq 1000, 1 \leq s \leq n),分别表示 Byte 城镇中的建筑物总数、已占用建筑区间的数量,以及学校所在建筑物的编号。

接下来的 m 行中,每行包含两个整数 l_i, r_i (1 \leq l_i \leq r_i \leq n),描述第 i 个已占用建筑区间。任意两个区间不重叠,即对任意 1 \leq i < j \leq m 都满足 r_i < l_j 或 r_j < l_i。另外,保证一定至少存在一座未占用的建筑物。

输出格式

输出一个整数 p,表示 Algolina 和 Bajtazar 应该入住的建筑物编号,以最小化与学校的距离 |s - p|。如果存在多个这样的编号,输出最小的那个。

样例输入 1:

10 2 7
5 9
1 2

样例输出 1:

4

样例输入 2:

15 4 9
4 5
10 13
1 1
6 9

样例输出 2:

14

样例解释: • 在第一个样例中,与学校(7号建筑)最近的未占用建筑是编号为 4 和 10 的建筑。应选择最小的编号,因此答案为 4。 • 在第二个样例中,唯一最靠近学校(编号9)的未占用建筑是编号为 14 的建筑。

2B

以下是题目的中文翻译,使用markdown格式,并用美元符号包裹数学公式:

题目:WYL 数玩具

算法挑战赛 2025,第二轮。内存限制:1024 MB,时间限制:2 秒。日期:2025年3月11日

在幼儿园里,小贝有很多玩具。有时候,她很难决定当天要玩哪一个玩具。为了简化选择过程,她决定使用一种数数游戏(类似“点兵点将”)。

假设某一天她要从 n 个玩具中选择一个玩具。她会把这 n 个玩具排成一排,从左到右依次编号为 1n。然后,她从某个玩具开始,按照儿歌(或数数游戏)中的每个音节,依次移动到当前玩具的前一个或后一个位置(注意:当她在最左边的玩具 1 时,只能向右移动到玩具 2;当她在最右边的玩具 n 时,只能向左移动到玩具 n1)。最后,她停在某个玩具上,这个玩具便是她当天要玩的。

小贝在进行数数游戏时,会记录自己指向每个玩具的次数。当数数游戏结束后,她记下了一个序列 a1,a2,,an,表示自己第 i 个玩具一共指过 ai 次。你的任务是判断小贝的记录是否有误,即:给定序列 a1,a2,,an,检查是否存在一种符合规则的数数游戏,使得每个玩具的指向次数恰好与序列一致。

这样的情景在 t 天中发生,每一天的玩具集合与儿歌的长度可能不同。

输入格式

第一行包含一个整数 t1t105),表示小贝使用数数游戏选择玩具的天数。

接下来共有 t 个对各天的描述,每一天描述格式如下: • 第一天描述的第一行包含一个整数 n1n106),表示当天参与数数游戏的玩具个数; • 第二行包含 n 个整数 a1,a2,,an0ai109),表示小贝记下的每个玩具被指向的次数。

你可以保证,对于每一天,至少存在一个 ai0

所有 t 天中 n 的总和不会超过 106

输出格式

输出共 t 行,每行输出一个字符串,要么是TAK(表示存在符合条件的数数游戏),要么是NIE(表示不存在)。

样例

输入样例

7
3
1 3 1
2
5 7
3
0 1 0
1
2
6
3 3 2 1 0 0
5
1 3 2 2 3
3
1 0 1

输出示例

TAK
NIE
TAK
NIE
TAK
NIE
NIE

样例解释 • 第一天,小贝可以依次指向玩具的顺序为:12123,符合 1,3,1。 • 第二天的记录不可能实现。 • 第三天,小贝只指了一次第二个玩具,然后停止。 • 第五天的序列可以为 1234321。 • 其他天的情况类似。

输出格式

对于每一天的记录,输出一行,若该序列可能通过数数游戏实现,则输出 TAK,否则输出 NIE。

2A

以下是题目的中文翻译,使用Markdown格式,数学公式已用美元符号($)包裹:

题目:考试(EGZ)

考试 [A] 算法对决2025年,第二轮。 限制:内存 1024 MB,时间 3 秒。 日期:2025311日。

Marysia 正在参加一个包含 n 个问题的考试。每个问题的评分方式如下: • 回答正确得 1 分; • 不作答得 0 分; • 回答错误得 1 分。

要通过考试,需要获得至少 t 分。

对于每个问题,Marysia 已经准备了一个可能的答案,但她不确定这些答案是否一定正确。具体地说,对于第 i 个问题,她知道自己的答案以概率 pi 是正确的。不同问题答案的正确性相互独立。

现在 Marysia 要决定哪些问题回答、哪些问题不回答,以便最大化通过考试的概率。

输入

第一行包含两个整数 n,t1tn50000),分别表示问题的数量和通过考试所需的最少得分。

接下来的 n 行,每行包含一个实数 pi0pi1),表示第 i 个问题的答案正确的概率,每个数最多有 9 位小数。

输出

输出仅一行一个实数,表示 Marysia 在采取最优策略选择作答问题的情况下,通过考试的概率。

输出必须使用十进制(非科学计数)表示,最多保留 20 位小数。

答案允许的最大绝对误差为 106

样例

输入示例1

5 2
0.77
0.85
0.75
0.98
0.6

输出示例1

0.8798125

输入示例2

5 3
0.3
0.01
0.2
0.15
0

输出示例2

0.009

输入示例3

3 3
0.000001
0.000001
0.000001

输出示例3

0

样例说明: • 第一个示例中,最优策略是回答前 4 个问题,不回答最后一个问题。这样即使回答错了 1 个问题,也仍能获得 2 分及以上。 • 第二个示例中,最优策略是回答第 134 个问题,这样若这 3 个问题全部答对,则 Marysia 得到 3 分。这三个问题的正确性相互独立,因此通过概率为 0.3×0.2×0.15=0.009。 • 第三个示例中,成功概率只有 1018,因此输出近似为 0

3C

求长宽高均为整数,对角线长度也为整数,且对角线长度不超过 n 的长方体数量。不区分底边的长宽,但区分高和长宽,即 a=1,b=2,h=3a=2,b=1,h=3 是同一个长方体,但是和 a=3,b=1,h=2 不同。

更新:由于题目特殊性,本题不允许在论坛中分享样例。

n5000

3B

对于一个整数 x,每次将 x 修改为,x 十进制表示所有数位的乘积,直到 x 为一位数。例如 57351555525100t 次询问,每次询问给定 n,对于 09 之间的每个 a,求 1n 的每个正整数进行上述操作后有几个数会得到 a

t1000,n1018

3A

时间轴视为 [0,L),有 n 个人,每个人在 [i,i+1) 可以是空闲的或者忙的。你需要选择一个最大的实数 T,使得可以给每个人找到一段长度为 T 的,连续的,不忙的时间用来睡觉,且每个时刻至少有一个人醒着且不忙。

读入一个 n×L 的矩阵,X 表示忙,. 表示空闲。答案以最简分数形式输出。如果不存在合法的分配方案,输出 -1

n18,L105

4C

你有 n 个立方体积木,编号从 1 到 n。 编号为 i 的积木的尺寸为 ai × ai × ai,并且涂有图案 wi(图案用整数标识)。你的目标是使用你选择的积木搭建一座评分最高的塔。塔由若干块积木平放堆叠而成,从底部到顶部依次为 j1, ..., jm(其中 m 是选择的积木数量)。塔的评分基于以下标准:

稳定性:如果塔中每一块积木都比它上面的积木大(即 ajx > ajx+1),则塔是稳定的。不稳定的塔得分为 0,无论其他标准如何。

高度:如果塔的高度为 h = aj1 + ... + ajm,则评分增加 h。

风格评分:相邻积木的图案不同(即 wjx ≠ wjx+1)会影响美观,因此每对这样的相邻积木会扣除 c 分。

输入 第一行包含两个整数 n 和 c(1 ≤ n, c ≤ 500,000),分别表示可用积木的数量和相邻积木图案不同时的扣分值。 接下来的 n 行 描述每个积木。第 i 行包含两个整数 ai 和 wi(1 ≤ ai, wi ≤ 500,000),分别表示立方体积木的边长和图案编号。积木按尺寸非递减顺序给出(即 ai ≤ ai+1)。 在部分测试用例中(占 5 分),保证 ai < ai+1。

输出 输出一个整数,表示使用给定积木可以搭建的最佳塔的评分。

4B

小 Algosia 有一个尺寸为 n × m 的矩形棋盘,棋盘被划分为 n · m 个正方形格子。 Algosia 喜欢在棋盘上摆放立方体积木玩耍。积木的尺寸与格子相同,因此 Algosia 总是将积木放在格子上,每个积木恰好占据一个格子。

玩完后,Algosia 总是会乖乖收拾积木。她的手很小,因此每次只能将一个积木从棋盘上移到盒子里。为了能够拿起积木,她必须能够用手指抓住积木的两个相对面,并且这两个面不能被相邻的积木挡住。换句话说,这样的积木要么左右没有邻居,要么上下没有邻居。

Algosia 今天开始玩时,棋盘上已经摆放了 k 个积木。随后,在父母的帮助下,她进行了 q 次操作,每次操作要么在棋盘上添加一个积木,要么移除一个积木(在父母的帮助下,即使积木被相邻积木挡住,也可以移除)。

Algosia 想知道,对于棋盘上的每一种积木配置(即游戏开始时以及每次操作后),她最多可以独立地依次移除多少个积木。Algosia 只是假设性地考虑这个问题——她实际上并不会移除这些积木。请编写一个程序,计算每种配置下她可以移除的积木数量。

输入 第一行包含四个整数 n、m、k 和 q(1 ≤ n, m ≤ 200,000,1 ≤ k, q ≤ 75,000),分别表示棋盘的高度、宽度、游戏开始时棋盘上的积木数量以及操作次数。 接下来的 k 行 每行包含两个整数 xi 和 yi(1 ≤ xi ≤ n,1 ≤ yi ≤ m),表示游戏开始时第 i 个积木所在的格子坐标。每个格子上最多只有一个积木。 接下来的 q 行 每行包含两个整数 xj 和 yj(1 ≤ xj ≤ n,1 ≤ yj ≤ m),表示第 j 次操作的格子坐标。如果该格子上没有积木,则操作是在该格子上添加一个积木;如果该格子上已经有积木,则操作是移除该积木。

输出 输出 q + 1 行,每行包含一个整数。第 i 行的整数表示在进行前 i - 1 次操作后,Algosia 可以独立地依次移除的积木数量。

评分 在部分测试用例中(占一定分数),保证 q = 1。

4A

经过数月充满失败的航行后,Floating Point 号的海盗们偶然发现了一笔由 m 枚相同的金币组成的宝藏。 他们决定分赃并结束这次航行。

在航行过程中,海盗们彼此熟悉。他们都知道,所有海盗都具备完美的逻辑思维能力(许多海盗的职业生涯始于破解软件安全),并且主要受贪婪驱使,尽管有些海盗比其他海盗更贪婪。此外,他们还明确建立了一个线性等级制度——海盗们被编号为 1 到 n。

为了分配宝藏,海盗们采用了一种传统的海盗技术。编号最小的海盗(在尚未被扔下船的海盗中)提出一个分配方案,即为每个未被扔下船的海盗 i 指定一个非负整数 bi,表示该海盗在提议的分配中将获得的金币数量(所有 bi 的总和为 m)。然后,所有海盗(包括提议者)对提议的分配方案进行投票。如果至少 50% 的海盗投票支持该分配方案,则宝藏将按照提议分配。否则,提出分配方案的海盗将被扔下船,不再参与后续谈判,也不会获得任何金币。然后,该过程会重复进行(由等级制度中的下一个海盗向剩余的海盗提出分配方案)。

每个海盗 i 会在以下情况下投票支持提议的分配方案:

如果分配方案被拒绝,他会被扔下船;

或者 bi ≥ di + ai,其中 di 是分配方案被拒绝后他将获得的金币数量,ai 是他的贪婪系数。

所有海盗都知道彼此的贪婪系数,并且知道所有人都会按照以下确定性策略行事:

如果不存在任何可接受的分配方案(即至少一半未被扔下船的海盗会接受的方案),则海盗会提议自己拿走所有宝藏,然后接受被扔下船的命运。

如果存在可接受的分配方案,则会提出其中一个方案(即使获得 0 枚金币也比被扔下船好)。

在多个可能的可接受方案中,海盗会选择自己获得最多金币的方案。

如果仍然存在多个方案,海盗们倾向于将更多金币分配给编号更大的海盗。具体来说,海盗 i 在选择可接受的分配方案时,会依次最小化海盗 i + 1、海盗 i + 2 等获得的金币数量。

你的任务是编写一个程序,根据上述规则确定每个海盗将获得多少金币。

输入 第一行包含两个整数 n 和 m(1 ≤ n ≤ 50,000,1 ≤ m ≤ 5,000,000),分别表示海盗的数量和需要分配的金币数量。 第二行包含 n 个整数 a1, a2, ..., an(1 ≤ ai ≤ 64),表示每个海盗的贪婪系数。

输出 输出一行,包含 n 个整数 b1, b2, ..., bn。如果第 i 个海盗在分配过程中被扔下船,则 bi = -1;否则,bi 表示该海盗获得的金币数量。

5C1

5C2

5B1

5B2

5A1

5A2

PA 中文翻译

2024-03-11 19:20:03 By PA (Love 5331226 ver)

1C

Algosia和Bajtek喜欢参加算法竞赛。在远程轮次中,共有18个任务需要解决,每个任务可以获得0到10分。参赛者按照获得的总分进行排名。如果总分相同,得到10分的任务数量更多的参赛者排名更高。如果还相同,得到9分的任务数量更多的参赛者排名更高,依此类推。如果还无法区分,那么宣布他们之间是平局。

Algosia和Bajtek记得他们在最后一次比赛中每个任务的成绩,但他们忘记了…谁赢了。你能帮助他们编写一个程序,读取他们的成绩并告诉他们哪个人排名更高吗?

输入

输入的第一行包含18个整数[0, 10]——Algosia在连续任务上的成绩。

同样,在输入的第二行中包含18个整数[0, 10]——Bajtek在连续任务上的成绩。

输出

输出的唯一一行应该包含一个单词——“Algosia”或“Bajtek”,表示获胜者的名字。如果是平局,应该使用“remis”。

例子

对于输入数据:

10 10 7 10 10 10 10 10 10 10 10 10 0 10 4 10 10 10
10 10 10 10 10 10 10 10 10 10 10 10 4 3 4 10 10 10

正确的结果是:

Algosia

示例解释:尽管Algosia和Bajtek都恰好获得了161分,但根据算法竞赛的规则,Algosia获得了更好的结果。

1B

根据PWN词典,“领导者”在其他方面也是“政党、工会或其他社会组织的领导人”。而在算法中,我们称一个序列中出现次数严格大于序列长度一半的元素为该序列的领导者。例如,序列[7, 2, 5, 7, 7]的领导者是数字7,而序列[2, 3, 2, 3]根本没有领导者。 在这个任务中,我们将关注“领导者”这一词的第二个含义。给定一个数字序列,你的任务是将它分割成尽可能少的序列(不一定是连续的),每个序列都有一个领导者,并输出这个最小的数目。可以证明,这样的分割总是可能的。

输入

输入的第一行包含一个整数n(1 ≤ n ≤ 500,000),表示序列的长度。 输入的第二行包含n个整数a1, a2, ..., an(1 ≤ ai ≤ n)。

输出

输出仅一行,应包含一个整数,表示可以将输入序列分割成的拥有领导者的结果序列的最小可能数量。

示例

对于输入数据:

5
1 2 3 1 2

正确的结果是:

2

示例解释:输入序列可以被分割成例如[1, 3, 1]和[2, 2]的序列。通过这种方式,两个结果序列都会有领导者(分别是数字1和2)。

1A

Bajtocka村庄正在进行现代化改造。最新的政府项目旨在向那些尚未拥有计算机的村庄和小城镇的居民提供计算机。Bajtazar负责监督计划中的一个村庄——Bajtoszyc的现代化改造,在这个村庄里,目前没有任何居民拥有计算机。 Bajtoszyc有n名居民,为了方便,Bajtazar用从1到n的整数对他们进行了编号。一开始,没有任何居民拥有计算机。Bajtazar的任务是处理三种类型的事件:

• + ai bi - 一台计算机被送到了Bajtoszyc的一位居民那里。但是Bajtazar不知道计算机是送给编号为ai还是bi的居民。可能发生ai = bi的情况——那么计算机肯定被送给了编号为ai的居民。可以肯定的是,计算机被送给了目前没有计算机的居民。

• - ci - 编号为ci的居民的计算机坏了。可以肯定的是,这位居民之前拥有计算机(但现在不会有了,因此未来可能会收到新的)。

• ? di - Bajtazar需要判断(根据他迄今为止获得的所有信息),编号为di的居民:肯定拥有计算机,肯定没有计算机,还是不确定是否拥有计算机。

编写一个程序,帮助Bajtazar回答他被问到的问题!

输入

输入的第一行包含两个整数n和q(1 ≤ n ≤ 300,000;1 ≤ q ≤ 1,000,000),分别表示Bajtoszyc的居民数量和Bajtazar需要处理的事件数量。

接下来的q行描述了任务描述中所述的各个事件。在所有事件中,都有1 ≤ ai, bi, ci, di ≤ n。

保证至少会有一次询问Bajtazar他的知识状态的事件,即输入至少包含一个‘?’类型的事件。也保证至少存在一种计算机交付过程,在该过程中,计算机总是被送给当前没有计算机的人,并且计算机总是会坏掉在当前拥有计算机的人那里。

输出

输出应该是一个长度等于‘?’类型事件数量的字符序列。如果在第i次查询时,该居民肯定拥有计算机,那么该序列中的第i个字符应该是‘1’。如果该居民肯定没有计算机,那么第i个字符应该是‘0’。如果该居民可能拥有计算机,但也可能不拥有,则第i个字符应该是‘?’。

示例

对于输入数据:

5 11
? 1
+ 1 2
+ 2 3
? 2
+ 3 1
- 2
? 1
? 2
? 3
+ 2 2
? 2

正确的结果是:

0?1011

示例解释:一开始没有人拥有计算机,所以对第一个问题的回答是否定的,输出的第一个字符是‘0’。然后送出了两台计算机,并且我们询问第二位居民是否拥有计算机。可能其中一台送给了他,但也可能是第一位和第三位居民分别收到了计算机。因此,我们不能确定第二位居民是否拥有计算机,答案是‘?’。注意,在下

2C

任务:ZNA

邮票 [C]

2024算法竞赛,第二轮。限制:1024 MB,2秒。2024年3月12日

Bajtazar曾经收集了一套相当大的邮票集。但他现在不像年轻时那么感兴趣了,因此他决定将自己的收藏赠送给年轻的集邮爱好者。不过,他希望这样做尽可能公平,于是需要你的帮助。

Bajtazar的收藏包含n枚邮票,其中第i枚来自于城市ai。为了简化,我们用整数来表示城市。Bajtazar打算在报纸上发布公告,宣布他计划赠送自己的收藏。如果有k位爱好者响应,他将给每位爱好者一些邮票的子集,并且要满足一个条件:每位爱好者必须获得相同的邮票多重集。这意味着,对于任意两位爱好者和任意一个城市,他们必须获得该城市相同数量的邮票。这可能意味着Bajtazar最终可能不会赠送任何邮票。

Bajtazar不知道到底会有多少人响应。因此,对于从1到n的每一个数k,你需要确定,如果有k位爱好者响应,Bajtazar最多可以赠送多少枚邮票。

输入

输入的第一行包含一个整数n(1 ≤ n ≤ 300,000),表示Bajtazar的邮票集中的邮票数量。

输入的第二行包含n个整数a1, a2, ···, an(1 ≤ ai ≤ 10^9)——表示Bajtazar的邮票分别来自哪些城市的编号。

输出

输出只有一行,包含n个由单个空格分隔的数字;第k个数字应等于如果有k位爱好者响应时,Bajtazar最多可以赠送的邮票数量。

示例

对于输入数据:

9
1 1 777 42 777 1 42 1 777

正确的结果是:

9 8 6 4 0 0 0 0 0

示例解释:如果只有一个爱好者响应,Bajtazar可以赠送他所有邮票。

如果有两位爱好者响应,Bajtazar可以给他们每人赠送两枚来自城市1的邮票,每人一枚来自城市42的邮票,以及每人一枚来自城市777的邮票,总共8枚邮票。

如果有四位爱好者响应,Bajtazar可以给他们每人赠送一枚来自城市1的邮票。

如果爱好者超过四人,Bajtazar将无法赠送任何邮票。

2B

任务:ALC

炼金术师Bajtazar [B]

2024算法竞赛,第二轮。限制:1024 MB,2秒。2024年3月12日

Bajtazar是一名著名的炼金术师,暂时搁置了制造哲人石的尝试,转而致力于物质的转化。具体来说,Bajtazar希望将一种分子转化为另一种分子。

Bajtazar拥有的分子由n个bajtonium原子组成,这些原子编号从1到n。某些原子对之间可能存在化学键,但每对原子之间最多只能存在一个化学键。Bajtazar的分子是一个连通体——从任一原子出发,都能通过一个或多个化学键到达其他任何原子。

Bajtazar有一份他想要获得的n原子分子的化学键描述——对于每对原子,他知道他是否希望它们最终通过化学键连接。目标分子也满足相同条件——它是一个连通体,且任意两个原子之间最多只有一个化学键。不幸的是,Bajtazar的分子可能与目标分子不同。为了解决这一问题,他可以利用他的炼金术能力。他随时可以执行以下两种操作之一:

  • Bajtazar可以选择两个未通过化学键连接的不同原子a和b,并在它们之间创建一个化学键。由于bajtonium的极高不稳定性,他只能在存在一个与a和b都当前连接的不同原子c的情况下才能这么做。
  • Bajtazar可以选择两个通过化学键连接的不同原子a和b,并移除它们之间的化学键。由于类似的原因,他只能在存在一个与a和b都当前连接的不同原子c的情况下才能这么做。

Bajtazar不希望在转化过程上花费太多时间。编写一个程序,帮助他将他的分子转化为目标分子,并且在不超过200,000步内完成。

输入

输入的第一行包含一个整数n(2 ≤ n ≤ 30,000),表示Bajtazar拥有的分子中的原子数量,以及目标分子中的原子数量。

输入的第二行包含一个整数ms(n−1 ≤ ms ≤ 50,000),表示Bajtazar拥有的分子中的化学键数量。

接下来的ms行每行包含两个整数。第i行中的数ai和bi(1 ≤ ai, bi ≤ n; ai ≠ bi)表示通过化学键连接的原子编号。保证Bajtazar的分子是一个连通体,且任意两个原子最多只能通过一个化学键连接。

输入的下一行包含一个整数md(n−1 ≤ md ≤ 50,000),表示目标分子中的化学键数量。

接下来的md行包含对这些化学键的描述,格式与Bajtazar拥有的分子的化学键描述格式相同。

  • 在Bajtocja,bajtonium是最常见的化学元素之一,用于生产食品和隐形眼镜等。

输出

输出的第一行应包含你想要执行的移动次数r,0 ≤ r ≤ 200,000。 接下来的r行应描述接下来的每个移动。如果你想在第i次移动中创建原子xi和yi之间的化学键,那么第i行应以符号‘+’开始,后跟一个空格,然后是xi和yi的数字,数字之间也由一个空格分隔。如果你想移除连接原子xi和

yi的化学键,则该行应以符号‘-’开始,然后以相同的格式包含xi和yi的数字。 你编写的移动序列必须符合任务描述中给出的条件——在选择原子xi和yi时,必须存在另一个与它们都连接的不同原子。执行移动序列后,最终分子必须与目标分子完全相同:对于每对原子i和j(1 ≤ i < j ≤ n),当且仅当在目标分子中原子编号为i和j的原子通过化学键连接时,它们也应在最终分子中通过化学键连接。 请注意,你不需要最小化移动次数——只需确保不超过200,000次。 可以证明,总是可以通过不超过200,000次移动完成转化。

示例

对于输入数据:

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

正确的结果是:

3
+ 1 3
+ 1 4
- 3 1

示例解释:注意到Bajtazar一开始不能直接在第一个原子和第四个原子之间创建化学键,因为当时不存在一个同时与它们两个连接的原子。通过在第一个原子和第三个原子之间创建一个临时的化学键,使得第三个原子成为了这样一个原子。

2A

任务:GRU

排列组 [A]

2024算法竞赛,第二轮。限制:1024 MB,15秒。2024年3月12日

在这个任务中,我们将处理n元素的排列。每一个这样的排列都是一个由1到n(包括)的n个不同自然数构成的序列。排列a1, a2, ..., an和排列b1, b2, ..., bn的组合是排列ab1, ab2, ..., abn。在排列p1, p2, ..., pn中,任何一对索引(i, j)(i < j且pi > pj)都称为一个逆序。 Bajtek是n元素排列的大粉丝。他如此喜爱它们,以至于他甚至有k个最喜爱的排列。他决定开始在纸上写下所有可能通过组合他的最喜爱的排列(以任何顺序和可能多次使用其中的一些)得到的排列,同时仔细确保不重复写下任何排列。 不出所料,他很快就用完了纸。然后Bajtek想知道:如果他写下了所有可达到的排列,它们平均会有多少逆序? 帮助他并编写一个程序来计算这个值。更准确地说,你的任务是给出这个值模1 000 000 007的结果(关于输出更多信息见输出部分)。

输入

输入的第一行包含两个整数n和k(1 ≤ n, k ≤ 3000),分别表示排列的长度和Bajtek的最爱排列的数量。 接下来的k行包含了这些排列。其中第i行包含n个不同的整数ai,1, ai,2, ..., ai,n(1 ≤ ai,j ≤ n),等于Bajtek的第i个最爱排列。

输出

输出只有一行,应该包含所有Bajtek可能写下的排列中平均逆序数的一个整数,给出模1 000 000 007的结果。 形式上,假设结果等于p/q,其中q ≠ 0且p和q的最大公约数为1。然后应该输出一个数p · q^(-1)(模1 000 000 007),其中q^(-1)是集合1, 2, ..., 1 000 000 006中唯一一个满足q · q^(-1) ≡ 1(模1 000 000 007)的数。 可以证明,对于所有满足任务条件的测试用例,结果是一个分母在约简形式下不被1 000 000 007整除的有理数。

示例

对于输入数据:

3 1
2 3 1

正确的结果是:

333333337

而对于输入数据:

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

正确的结果是:

5

示例解释:在第一个示例测试中,Bajtek将写下排列{1, 2, 3},有0个逆序,{2, 3, 1},有两个逆序,以及{3, 1, 2},也有两个逆序。因此,逆序的平均数量是4/3。由于3^(-1) ≡ 333333336(模1 000 000 007),我们有333333336 · 4 ≡ 1333333344 ≡ 333333337(模1 000 000 007)。 在第二个示例测试中,Bajtek将写下所有5个元素的排列。容易证明,它们平均有正好5个逆序。

3C

任务:OBR 画作 [C] 2024算法竞赛,第三轮。限制:1024 MB,2秒。2024年3月13日

Bajtazar刚搬进新公寓。在已经用来自各种朗诵比赛和Bajtocja定时呼啦比赛的奖杯装饰了书架后,他注意到一面墙完全空着。他不喜欢这样,所以想要用画作填满它。

Bajtazar的墙是一个h×w米的矩形。附近的艺术经纪人,是Bajtazar的好朋友,提供n种类型的画作,每种类型的画作都有无限数量。同一类型的所有画作尺寸完全相同——第i种类型的画作总是边长为di米的正方形。有趣的是,对于任意两个不同的di值,一个总是另一个的倍数。

对Bajtazar来说,画作的价格不是问题(毕竟在定时呼啦比赛中的奖金相当丰厚),但他希望确保墙上没有任何空白处。为此,他决定购买一定数量的画作并挂在墙上以完全覆盖它。当然,画作不能相互覆盖,但可以相互接触边缘。Bajtazar不想多次往返艺术经纪人那里——因此他希望尽可能少地购买画作。帮助他编写一个程序,计算他需要购买的画作数量,或者判断覆盖整面墙是否不可能。

输入

输入的第一行包含两个整数h和w(1 ≤ h, w ≤ 10^9)——Bajtazar的墙的尺寸。

输入的第二行包含一个整数n(1 ≤ n ≤ 30)——画作类型的数量。

输入的第三行包含n个不同的整数d1, d2, ..., dn(1 ≤ di ≤ 10^9;di < di+1;di+1是di的倍数)——各类型画作的尺寸。

输出

如果覆盖墙面是可能的,输出的一行应包含一个整数,表示覆盖墙面所需的最少画作数量。否则,这一行应该是-1。

示例

对于输入数据:

6 10
3
1 3 6

正确的结果是:

9

而对于输入数据:

3 3
1
2

正确的结果是:

-1

示例解释:在第一个示例测试中,Bajtazar可以用九幅画(六幅1×1尺寸,两幅3×3尺寸和一幅6×6尺寸)覆盖墙面,例如以以下方式: 在第二个示例测试中,不可能精确覆盖墙面。

3B

任务:ZEL

软糖 [B]

2024年算法对抗赛,第三轮。限制:1024 MB,3秒。2024年3月13日

Bajtek非常喜欢软糖。在新开的商店里(这家店只卖软糖),可以购买多达n种类型的软糖——第i种类型的软糖由软糖的颜色、重量(以bajtogram为单位)及价格(以bajtogrosz为单位)来描述。软糖是单独出售的。软糖的颜色用从1到k的数字表示。商店里有每种类型的软糖无限供应。

除了软糖,Bajtek还非常喜欢颜色美学。他只会在每种颜色的软糖都买相同数量的情况下,才会购买一些软糖的多重集合。

除了软糖和颜色美学,Bajtek还非常喜欢数字。对于区间[0, m − 1]内的每一个整数r,他都想知道,为了购买一个软糖的多重集合,在这个集合中所有软糖的总重量除以m的余数为r时,他至少需要花费多少bajtogrosz。请帮助他,编写一个程序来计算这些所需的值!

输入

在标准输入的第一行中有三个整数n, k和m(1 ≤ n, k, m ≤ 7000),分别表示软糖的销售种类数、软糖的颜色数以及上述的m值。 在接下来的n行中,每行包含三个整数。第i行的数字分别是ki, mi和ci(1 ≤ ki ≤ k; 1 ≤ mi ≤ m; 1 ≤ ci ≤ 10^9)——分别代表第i种软糖的颜色、重量(以bajtogram为单位)和价格(以bajtogrosz为单位)。

输出

输出应该包含m行。在其中的第i行,应该有一个整数——Bajtek可以购买的、使得软糖总重量除以m的余数为i−1的软糖多重集合的最小总价格。如果这样的多重集合不存在,那么在这一行应该输出数字−1。

例子

对于输入:

3 2 6
1 2 1
2 2 2
1 1 5

正确的结果是:

0
10
6
7
3
13

而对于输入:

2 3 3
1 1 1
3 1 1

正确的结果是:

0
-1
-1

示例解释:在第一个示例测试中:

·为了使软糖总重量能被m = 6整除,Bajtek可以不购买任何软糖——这样他根本不需要花费钱。

·为了使软糖总重量除以6的余数为1,Bajtek应该购买一个第一种类型的软糖,两个第二种类型的软糖,以及一个第三种类型的软糖。这样他将支付10 bajtogrosz,并获得两种颜色的软糖,总重量等于7 bajtogram。

·为了使软糖总重量除以6的余数为5,Bajtek应该购买两个第一种类型的软糖,三个第二种类型的软糖,以及一个第三种类型的软糖。 在第二个示例测试中,没有提供第二种颜色的软糖——唯一满足Bajtek要求的解决方案是不购买任何软糖。

3A

任务:SPL

序列交织 [A]

2024年算法对抗赛,第三轮。限制:1024 MB,9秒。2024年3月13日

在数列C中,我们将每一个非空且连续的子序列称为区间。特别地,这意味着每个长度为k的序列有k(k+1)/2个区间,因为每个区间都是由它的起始和结束位置确定的。 给定一个整数序列,我们将其最长严格单调区间的长度称为序列的稳定性。具体而言,序列[c1, c2, ... , ck]的稳定性是最大的整数s,使得存在索引i(1 ≤ i ≤ k - s + 1),满足ci < ci+1 < ... < ci+s-1或ci > ci+1 > ... > ci+s-1。例如序列[8, 6, 1, 3, 5, 7, 4, 2]的稳定性为4,因为它包含一个严格单调区间[1, 3, 5, 7],而不存在更长的。

两个序列A和B的交织是指一个长度为|A| + |B|的序列,该序列包含一个子序列(不一定连续)等于A,且所有不在该子序列中的元素构成序列B。例如,序列[1, 2, 3]和[4, 5]的交织序列包括[1, 4, 2, 5, 3]、[4, 5, 1, 2, 3]和[4, 1, 5, 2, 3],但不包括[1, 2, 3, 4, 3]和[1, 2, 3, 5, 4]。

最终,对于整数序列A和B,我们用f(A, B)表示它们的交织可能具有的最小稳定性。

给定两个整数序列A和B,长度分别为n和m,你的任务是对每一个整数x从1到n + m,计算满足条件的(A′, B′)对的数量,使得A′是A的一个区间,B′是B的一个区间,并且满足f(A′, B′) = x。由于得到的数值可能非常大,只需给出它们除以10^9 + 7的余数即可。

可以假设序列A和B中的所有元素都是互不相同的。

输入

输入的第一行包含两个整数n和m(1 ≤ n, m ≤ 300,000),分别代表序列A和B的长度。

输入的第二行包含n个整数A1, A2, ..., An(1 ≤ Ai ≤ n + m)——序列A。

输入的第三行包含m个整数B1, B2, ..., Bm(1 ≤ Bi ≤ n + m)——序列B。

保证序列A和B中的所有元素都是唯一的。换句话说,序列A和B的连接构成了从1到n + m的数的一个排列。

输出

输出仅一行,包含n + m个由单个空格分隔的数字;其中第i个数字等于满足条件的(A′, B′)对的数量,使得A′是A的区间,B′是B的区间,并且f(A′, B′) = i,结果对10^9 + 7取模。

示例

对于输入:

5 3
1 2 5 7 4
8 3 6

正确结果为:

0 84 6 0 0 0 0 0

示例解释:对于整个序列作为区间的情况,f([1, 2, 5, 7, 4], [8, 3, 6]) = 2,其交织序列稳定性等于2的一个

4C

任务:LAM

谜题 3 [C]

2024年算法对战,第四轮。限制:1024 MB,2秒。2024年3月14日

Bajtek喜欢玩手机游戏。然而,他经常感到烦恼的是那些出现的广告中,玩家表现得非常糟糕,这是为了激发观看者的挫败感和游玩欲望。其中一则广告(你们可能也见过)给Bajtek留下了深刻的印象。

因为灵感可以来自一切,Bajtek决定基于上述游戏创造一个任务。他将选择一个目标彩色棋盘,尺寸为n×m,游戏开始时的棋盘为n×m,没有任何颜色。每次移动,他可以选择一行或一列,并用他选择的颜色涂满(注意,这比上面图片中的游戏给予的更多自由,那里的行和列有指定的颜色)。为了正式化任务,他用英文字母的大写表示所有颜色。你能帮他写一个程序,对于他指定的每个棋盘,给出一个正确创建目标颜色布局的移动序列吗?你可以假设你将获得的输入数据中,这个目标可以在最多n + m步内实现。

输入

标准输入的第一行包含两个整数n和m(1 ≤ n, m ≤ 2000),分别代表棋盘的高度和宽度。

接下来的n行每行有m个字符,每个字符都是英文字母的大写;第i行的第j个字符表示位于第i行和第j列的棋盘格子的目标颜色。

保证给定的颜色布局可以通过题目描述中说的最多n+m步骤序列来实现。

输出

输出的第一行应该包含一个整数r(1 ≤ r ≤ n+m),表示你想要进行的移动次数。接下来的r行中,每行应该描述一个移动。

一个移动的描述应该以字符‘R’或‘K’开头,表示你想要涂色的是行还是列(其中‘R’表示行,‘K’表示列)。之后,跟着一个空格,应该是你想要涂色的行或列的编号。行从上到下用1到n的数字编号,列则从左到右用1到m的数字编号。然后,再跟着一个空格,应该是一个大写的英文字母,表示你想要将选定的行或列涂成的颜色。

注意,你不需要最小化移动次数——只要确保最多不超过n + m。

示例

对于输入数据:

5 5
AAPAA
APPAA
AAPAA
AAPAA
APPPA

一个正确的结果可能是:

10
R 1 Z
K 4 A
K 2 P
R 5 P
R 4 A
R 3 A
R 1 A
K 5 A
K 3 P
K 1 A

而对于输入数据:

2 3
AAA
PPP

一个正确的结果可能是:

2
R 2 P
R 1 A

示例解释:如果在第一个示例测试中,我们假设字母‘P’代表绿色,字母‘A’代表黄色,而字母‘Z’代表蓝色,那么选定的移动序列将以以下方式涂色棋盘:

4B

任务:DES

空降3 [B]

2024年算法战斗,第四轮。限制:1024 MB,4秒。2024年3月14日

巴杰托邦(再次)计划攻击比托邦。精英特种部队巴杰特隆拥有n名士兵,他们在今天早晨的集合中排成一列。负责执行空降的将军巴杰萨尔,从左到右用1到n的数字编号他们的位置。 每个士兵要么准备好执行空降,要么因为法律修正案需要额外训练。巴杰萨尔将军希望所有准备好空降的士兵能形成队列的一个连续区间。更正式地,他希望不存在这样的士兵位置三元组1 ≤ i < j < k ≤ n,使得第i位和第k位士兵准备好空降,而第j位士兵没有准备好。 由于这个条件可能不会默认满足,巴杰萨尔将下达m个命令。在第i个命令中,他将命令位于位置ai和bi的士兵相互通讯以交换他们的位置。只有当ai位士兵准备好空降,而bi位士兵没有准备好时,士兵们才会交换位置。 巴杰萨尔已经选择了一系列命令并打算下达它们。但他不知道有多少士兵准备好空降或他们处于哪些位置。因此,对于从1到n的每一个整数k,他想要解决以下问题:考虑所有n中恰好有k名士兵准备好空降的初始配置。在执行所有命令后,有多少配置满足巴杰萨尔的条件(即,准备好空降的士兵形成队列的一个连续区间)?帮助他计算他所寻求的值! 注意:由于算法战斗中有许多初学者程序员参加,我们决定不用大数字来折磨你们。因此,对于每个k,只需提供可能性数量除以2的余数。

输入

输入的第一行包含两个整数n和m(2 ≤ n ≤ 35;1 ≤ m ≤ 1000),分别表示队列中的士兵数量和命令数量。

接下来的m行包含命令的描述;其中的第i行包含两个整数ai和bi(1 ≤ ai, bi ≤ n; ai ≠ bi),如任务描述中所述。

输出

输出的第一行和唯一一行应该包含n个用单个空格分隔的整数;其中的第k个应该等于初始配置中恰好有k名士兵准备好空降,并且在执行所有命令后,所有准备好的士兵形成一个连续区间的配置的数量除以2的余数。

示例

对于输入:

4 4
4 1
1 2
3 4
1 4

正确的结果是:

0 0 1 1

示例解释:如果最初只有一个士兵准备好空降,那么他肯定会形成(一个元素的)连续区间。但不存在两个士兵准备好空降并且最终站在彼此旁边的情况。 考虑所有除第二个士兵外都准备好空降的情况。第一个命令不会影响士兵的位置。在第二个命令后,因为第一个士兵准备好

4A

任务:KOL 彩色森林 [A] 2024年算法战斗,第四轮。限制:1024 MB,8秒。2024年3月14日

为了庆祝π日,Bajtazar收到了一个森林作为礼物(一个无向无环图)包含n个顶点。

在这个森林中,顶点被编号为从1到n,边被赋予正整数长度。

此外,每个顶点都有一个用整数描述的颜色。最初,所有顶点的颜色都是0。

因为是你送给Bajtazar这份礼物,现在你的任务是回答Bajtazar关于这个森林的查询。每个查询都是以下几种类型之一:

  • 1 ai bi di - Bajtazar在顶点ai和bi之间添加一条长度为di的无向边。保证添加这条边后图仍然不会有环。
  • 2 ai bi - Bajtazar移除连接顶点ai和bi的边。
  • 3 vi zi ki - Bajtazar将从顶点vi可达且距离不超过zi的所有顶点重新涂色为颜色ki。这里的距离是指两个顶点之间简单路径上的边长度之和。
  • 4 ui - Bajtazar询问顶点ui的当前颜色。

输入

输入的第一行包含三个整数n, m和q (2 ≤ n ≤ 200,000; 0 ≤ m ≤ n − 1; 1 ≤ q ≤ 200,000),分别表示森林中的顶点数量、最初存在的边数量以及查询的数量。

接下来的m行中包含森林中边的描述。其中的第i行包含三个整数ai, bi和di (1 ≤ ai, bi ≤ n; 1 ≤ di ≤ 10^9),表示顶点ai和bi之间连接着一条长度为di的边。

接下来的q行中包含查询的描述,格式如任务描述中所示。所有查询中都满足1 ≤ ai, bi, vi, ui ≤ n, 1 ≤ di ≤ 10^9, 0 ≤ zi ≤ 10^15以及1 ≤ ki ≤ 10^9。

保证给出的m条边描述了一个合法的森林,且每次修改后图仍然是一个合法的森林,并且永远不会有删除当前不存在的边的查询。

还保证至少会有一个第四类型的查询。

输出

输出应该包含和输入中第四类型查询数量一样多的行。每行包含一个整数——Bajtazar询问的顶点的颜色。

示例

对于输入:

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

正确的输出是:

0
5
3
0
0

子任务

  • 在一些测试组中,没有第一种和第二种类型的查询,并且满足m = n − 1。
  • 在一些测试组中,所有第三种类型的查询中zi = 10^15。

对于每种上述情况,至少存在一个满足条件的组。这些组对于两个条件可以是相交的也可以是不相交的。

5C1

任务:BUC

非常喜爱的序列 [C]

算法竞赛 2024,第五轮。限制:1024 MB,6 s。2024年3月15日

3SUM 是一个著名的算法问题,给定一个整数序列 c1, c2, ... , cm,需要找到三个索引 i < j < k,使得 ci + cj + ck = 0。

对于任意整数序列,在 O(m^2) 之外没有已知的更好的解决方案。

幸运的是,Bajtek 不知道这一点,并决定为他的非常喜爱的序列解决这个问题。

Bajtek 的喜爱的序列由 n 个整数 a1, a2, ... , an 组成。通过考虑 Bajtek 喜爱的序列的所有 n(n+1)/2 个连续区间,计算它们的元素之和,并将所有这些和(包括重复)放在一个序列中(按区间起始索引的升序排列,如果起始索引相同,则按结束索引的升序排列),得到 Bajtek 的非常喜爱的序列。

为了增加难度,Bajtek 不仅仅是寻找满足 i < j < k 的三个索引的组合。他想知道正好有多少个这样的索引三元组,它们对应的元素之和为零。

帮助他编写一个程序来计算这样的三元组数量吧!

输入

在标准输入的第一行中有一个整数 n (1 ≤ n ≤ 500),表示 Bajtek 喜爱的序列的长度。

下一行包含 n 个整数 ai (|ai| ≤ 20,000),代表 Bajtek 喜爱的序列的连续元素。

输出

在标准输出的第一行和唯一一行中应该有一个整数 —— 对应于 Bajtek 非常喜爱的序列中的和为零的三个索引的组合的数量。

示例

对于输入:

3
7 -4 -2

正确的输出是:

1

对于输入:

10
0 0 0 0 0 0 0 0 0 0

正确的输出是:

26235

示例解释:在第一个示例测试中,非常喜爱的序列是 [7, 3, 1, -4, -6, -2],唯一的不同元素三元组其和为 0 是 3 + 1 + (-4),因此答案是 1。 在第二个示例测试中,Bajtek 的非常喜爱的序列由五十五个零组成。对于任意三个索引 i < j < k,它们对应的元素之和等于 0,这样的三元组有 26,235 个。

5C2

任务:ZAR

灯泡 [C]

算法竞赛 2024,第五轮。限制:1024 MB,3 s。2024年3月15日

Bajtazar 拥有编号为 1 到 n 的 n 个灯泡以及 m 个开关。每个灯泡最初可能是开着的或者关着的。每个开关影响一对灯泡。使用它会改变它们的状态,但仅当它们处于相同状态时——都是开着的或都是关着的。如果它们处于不同状态,按下开关不会有任何效果。

Bajtazar 想知道,通过任意次数、任意顺序使用开关(可能多次使用某些开关),他能达到多少种不同的灯泡开关状态配置。如果在两种配置中有任意一个灯泡在一种配置中是开着的而在另一种配置中是关着的,则认为这两种配置是不同的。由于结果可能很大,只需给出其除以 10^9 + 7 的余数。

输入

输入的第一行包含两个整数 n 和 m (1 ≤ n ≤ 200,000; 0 ≤ m ≤ 400,000),分别表示灯泡的数量和开关的数量。

输入的第二行包含 n 个数字 ci (ci ∈ {0, 1}),用单个空格分隔。如果 ci = 1,则表示第 i 个灯泡最初是开着的。否则(ci = 0),第 i 个灯泡最初是关着的。

接下来的 m 行描述开关;其中第 i 行包含两个整数 ai 和 bi (1 ≤ ai, bi ≤ n; ai ≠ bi) - 表示第 i 个开关影响的灯泡编号。

你可以假设开关影响不同的无序灯泡对。更正式地说,对于任意一对不同的索引 i, j 在 1 到 m 之间,有 (ai, bi) ≠ (aj, bj) 且 (ai, bi) ≠ (bj, ai)。

输出

输出的第一行和唯一一行应该包含除以 10^9 + 7 后的可达到的灯泡开关状态配置的数量的余数。

示例

对于输入:

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

正确的输出是:

4

示例解释:可达到的最终灯泡状态为 10110, 00010, 00111 和 10011。

5B1

任务:DZI

除数 [B]

算法竞赛 2024,第五轮。限制:1024 MB,15 s。2024年3月15日

评委选定了一个整数 x 从区间 [1, n]。你的任务是猜出这个数字。为了不让你完全摸黑,你可以提出询问。在每次询问中,你可以提供一个整数 y 从区间 [0, c],然后我们会告诉你 x + y 的正除数的数量。

为了使任务更具挑战性,在单次程序运行中,你将需要解决 t 个测试案例。你可以在这些测试案例中总共提出的询问数量受到 q 的限制。

交流

这是一个交互式任务。你需要写一个程序来与评委库通信,使用提供的库。要使用库,你需要在你的程序中包括:

  • C++:#include "dzilib.h"
  • Python:from dzilib import GetT, GetN, GetQ, GetC, Ask, Answer

库提供以下函数:

  • GetT() - 返回测试案例的数量 t。
  • GetN() - 返回隐藏值 x 的限制 n。
  • GetQ() - 返回你在所有测试案例中可以提出的询问总数的限制 q。
  • GetC() - 返回你可以提供的 y 值的限制 c。
  • Ask(y) - 返回隐藏数字 x 增加 y 后的正除数数量。必须满足 0 ≤ y ≤ c。
  • Answer(z) - 通知库你认为隐藏的值 x 为 z。没有返回值(在 C++ 中,函数类型为 void)。

在 Python 中,库函数的所有参数和返回值都是整数类型。在 C++ 中,函数接收和返回的类型与提供的示例库中的相同,有关更多信息请参阅实验部分。

在程序运行的任何时刻(除了程序结束时),都会有一个测试案例处于活动状态。程序开始运行时,第一个测试案例立即激活。当一个测试案例处于活动状态时,你可以使用 Ask 函数提出询问。当你确定知道隐藏的 x 值时,你可以通过 Answer 函数提供它,然后库将进行验证。如果提供的值不正确,库将终止程序运行,并返回“错误答案”的判决。如果参数值正确,则函数结束;如果解决的测试案例不是最后一个,则立即激活下一个。在回答了最后一个测试案例后,你应该结束程序的运行。如果你不这样做,并尝试使用 Ask 或 Answer 函数,你将收到“错误答案”的判决。

你可以在程序运行的任何时刻使用 GetT, GetN, GetQ, 以及 GetC 函数,它们返回的值不会改变。这些函数不计入询问限制,但会消耗处理器时间。

q 值仅限制 Ask 函数的调用次数。当你超过允许的总询问次数时,库将终止程序运行,并返回“错误答案”的判决。

不应从标准输入读取任何数据,也不应向标准输出打印任何内容。故意尝试影响评审库内部运行的尝试是禁止的。

所有测试中的隐藏值 x 及其顺序都是预先设定的。这意味着,与你的程序通信的库不会是恶意的,也不会根据你的程序的操作调整其行为。

任务说明中给出的限制仅适用于你的程序使用的时间和内存。库的运行时间和使用的内存可能取决于测试和你的程序的确切行为。因此,SIO2 中的时间和内存限制比任务说明中给出的稍大。

测试案例示例

在示例测试中,t = 2, n = 10^6, q = 10^4, c = 10^15,隐藏的值依次是 1000 和 1,与库的示例通信可能如下:

调用函数 结果 描述
GetT() 2 t = 2。
GetN() 1,000,000 n = 10^6。
GetQ() 10,000 q = 10^4。
GetC() 1,000,000,000,000,000 c = 10^15。
Ask(1) 8 x + 1 有 8 个正除数:1, 7, 11, 13, 77, 91, 143, 1001。
Ask(24) 11 x + 24 有 11 个正除数:1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024。
Answer(1000) - 提供正确答案,激活下一个测试案例。
GetT() 2 允许的查询 - 返回值不变。
Answer(1) - 提供正确答案,结束最后一个测试案例。提供答案后应结束程序运行。

提出了 2 个 Ask 查询,符合 10,000 查询的限制。记住,计算的是所有测试案例中的总查询数量。

5B2

任务:KRA

水龙头 [B]

算法竞赛 2024,第五轮。限制:1024 MB,4 秒。2024年3月15日

Radek及其朋友们的公司老板Radek尝试淹没竞争对手Mati及其合伙人公司的所有文件架。为了完美地进行破坏,他请他的朋友,水管工Janusz,在每个文件架上方安装微小的水龙头。

为简化,Mati公司的文件架可以用平面上的线段表示。每个文件架是一对点 (li, hi) 和 (ri, hi) 之间的线段。由水管工安装的水龙头是点,坐标为 ((li+ri)/2, hi + 0.5)。此房间的地板由OX轴表示。

当打开第 i 个文件架上方的水龙头时,该文件架将被淹没。自然地,水开始从文件架的边缘垂直向下滴落,并可能淹没下一个文件架或滴落到带有自然排水系统的地板上。

打开一个水龙头后水流向下的可视化,在第二个示例测试中。

Radek将按照某个固定的顺序考虑水龙头。当他考虑第 i 个水龙头时,仅当第 i 个文件架尚未被淹没时才会打开它。

Radek尚未决定他将按哪种顺序考虑水龙头。他将从 n! 个顺序中随机选择一个,每个顺序的概率相同。现在Radek想知道,他平均需要打开多少个水龙头。

你的任务是回答Radek的问题,并给出模 10^9 + 7 的答案。形式上,设结果等于 p/q,其中 q ≠ 0 且 GCD(p, q) = 1。那么应该输出一个数字 p·q^(-1) (mod 10^9+7),其中 q^(-1) 是集合 {1, 2, ..., 10^9 + 6} 中唯一一个使得 q · q^(-1) ≡ 1 (mod 10^9 + 7) 的数字。

可以证明,对于所有满足任务条件的测试,结果是一个分母在约简后不可被 10^9 + 7 整除的有理数。

输入

输入的第一行包含一个自然数 n (1 ≤ n ≤ 500,000),表示Mati公司的文件架数量。

接下来的 n 行包含文件架的描述。第 i 行包含两个自然数 li, ri (1 ≤ li < ri ≤ 2·n),如任务描述中所述。为简化,我们假设 hi = i。

可以假设所有的数字 li, ri 是两两不同的——数字 li, ri 构成了从 1 到 2·n 的一个排列。

输出

标准输出的唯一一行应该包含一个数字,即Radek需要打开的水龙头的平均数量,模 10^9 + 7。

示例

对于输入:

3
4 6
1 3
2 5

正确的输出是:

2

而对于输入:

5
2 9
3 4
1 8
6 10
5 7

正确的输出是:

233333338

示例解释:考虑Radek在第一个示例测试中分析水龙头的所有可能顺序:

  • 对于顺序 1, 2, 3,他将打开所有 3 个水龙头。
  • 对于顺序 1, 3, 2,他将打开第一个和第三个水龙头。打开第三个水龙头后,水也会淹没第

二个文件架,因此不需要再打开第二个水龙头。

  • 对于顺序 2, 1, 3,他将打开所有 3 个水龙头。
  • 对于顺序 2, 3, 1,他将打开第二个和第三个水龙头。打开第三个水龙头后,水也会淹没第一个文件架,因此不需要再打开第一个水龙头。
  • 对于顺序 3, 1, 2 和 3, 2, 1,他只会打开第三个水龙头。打开后,所有文件架都将被淹没,因此不需要再打开其他水龙头。

因此,Radek平均需要打开 1/6·(3 + 2 + 3 + 2 + 1 + 1) = 2 个水龙头。

在第二个示例测试中,Radek平均需要打开 91/30 个水龙头。由于 30^(-1) ≡ 233333335 (mod 10^9 + 7),因此我们有 91 · 233333335 ≡ 21233333485 ≡ 233333338 (mod 10^9 + 7)。

5A1

任务:AUT

高速公路 2 [A]

算法竞赛 2024,第五轮。限制:1024 MB,4 秒。2024年3月15日

经过多年无意义的战争后,Bajtocja和Bitocja终于签订了和平条约。作为两国首都之间最终和解的标志,一条高速公路被建造了。你被指定为负责从Bajtocja向Bitocja方向的高速公路管理者。

目前,高速公路上有 m 个收费站,按从 1 到 m 的顺序编号。第一个收费站位于高速公路的起点,最后一个位于终点。通过某个收费站的费用可能会在一天中的不同时间有所不同。一天被分为 n 个小时,编号为 1 到 n。当前通过 j 号收费站的费用在 i 小时为 ci,j bajtalars。其中一些费用可能为 0(通过收费站是免费的)或甚至为负数(司机在通过收费站时将获得 −ci,j bajtalars)。

整个高速公路足够短,以至于可以在一小时内通过。但当然,不需要这么急——在旅途中可以随意停留。然而,不能在高速公路上过夜;必须在同一天通过所有收费站。

显然,司机希望以尽可能低的成本通过高速公路。通过 f(i, j) 表示如果司机在第 i 小时通过第一个收费站,而在第 j 小时通过最后一个收费站,那么通过整个高速公路的最小可能成本。所有的 f(i, j) 值已经在和平条约中由两国政府确定,因此作为高速公路的管理者,你无法更改它们。但是,你可以自由修改通过各个收费站的收费标准,或者甚至完全关闭一些收费站,只要第一个和最后一个收费站保持开放,f(i, j) 的值不变,以及你设定的所有费用都是一定数量的 bajtalars 的整数倍。

为了最小化高速公路的维护成本,你希望关闭尽可能多的收费站。确定必须保持开放的收费站的最小数量,以便仍然满足条约的条件。

收费模式重组项目将分为两个阶段。在第一阶段——初步设计阶段——只需找到最优的收费站数量即可。但在第二阶段——项目实施阶段——你还需要提供保留收费站的整个示例收费标准。

输入

输入的第一行包含三个整数 n, m 和 q (2 ≤ n, m ≤ 30,000; n·m ≤ 300,000; q ∈ {0, 1}),分别表示一天中的小时数,高速公路上当前的收费站数量,以及描述项目阶段的位。q 值为 0 表示项目处于初步设计阶段,而 q 值为 1 表示项目已进入实施阶段。

接下来的 n 行包含当前收费信息;第 i 行包含 m 个整数 ci,1, ci,2, ..., ci,m (−10^6 ≤ ci,j ≤ 10^6)。ci,j 的值表示在第 i 小时通过第 j 个收费站的费用,以 bajtalars 表示。如果 ci,j 的值是负数,则通过第 j 个收费站的费用会给司机 −ci,j bajtalars。

输出

输出的第一行应包含一个整数 k (2 ≤ k ≤ m),表示为了不更改任何 f(i, j) 的值而需要保留在高速

公路上的最小收费站数量。如果 q = 0,输出应只包含这一个数字的一行。

如果 q = 1,则接下来的 n 行应包含符合任务条件的示例最优收费标准。第 i 行应包含 k 个整数 di,1, di,2, ..., di,k (−10^12 ≤ di,j ≤ 10^12)。di,j 的值表示在第 i 小时通过保留的第 j 个收费站的新费用。

可以证明,对于任务的限制,总是可以确定绝对值不超过 10^12 的整数费用。

示例

对于输入:

3 6 1
-1 0 4 0 -3 0
-4 1 5 2 -5 2
-5 2 3 0 -2 2

一个可能的正确输出是:

3
0 0 0
0 1 0
0 0 0

而对于输入:

5 7 0
0 0 0 8 0 0 0
0 7 6 5 9 7 0
0 0 0 5 9 6 0
9 4 0 4 4 7 0
0 0 0 9 8 6 0

正确的输出是:

3

示例解释:在第一个示例测试中,通过高速公路的各个最小成本分别为:

  • f(1, 1) = (−1) + 0 + 4 + 0 + (−3) + 0 = 0,
  • f(1, 2) = (−1) + 0 + 4 + 0 + (−5) + 2 = 0,
  • f(1, 3) = (−1) + 0 + 4 + 0 + (−5) + 2 = 0,
  • f(2, 2) = (−4) + 1 + 5 + 2 + (−5) + 2 = 1,
  • f(2, 3) = (−4) + 1 + 3 + 0 + (−2) + 2 = 0,
  • f(3, 3) = (−5) + 2 + 3 + 0 + (−2) + 2 = 0。

无法通过使用两个收费站实现相同的通过成本。请注意,即使在提议的 di,j 费用下,第一个和最后一个收费站没有收取任何费用,它们也不能被关闭。

在第二个示例测试中,输出不包含新的收费标准提议,因为收费模式重组项目仍处于初步设计阶段。

5A2

任务:MON

硬币 [A]

算法竞赛 2024,第五轮。限制:1024 MB,25 s。2024年3月15日

Natalia和Cezary喜欢玩游戏,尤其是他们自己发明的游戏。他们决定在自己面前排列一系列的硬币堆,每堆有m枚硬币,每枚硬币要么是蓝色,要么是红色。Natalia在她的回合中可以选择任何一枚蓝色硬币,并将其连同堆中所有位于它上面的硬币一起从游戏中移除。类似地,在他的回合中,Cezary可以选择任何一枚红色硬币,并将其以及同一堆中所有位于它上面的硬币从游戏中移除。

玩家将轮流进行操作,谁不能执行合法的操作就输了——也就是说,当他的所有硬币都已经被之前移除出游戏时。

现在他们已经知道了规则,他们需要决定游戏的初始状态——一系列d堆,每堆确切地包含m枚硬币。Natalia和Cezary都不希望拥有不公平的优势,所以他们一致认为,硬币堆的序列应该是公平的。如果假设Natalia和Cezary都采取最优策略,那么不执行首个操作的玩家将会获胜的硬币堆序列被称为公平的。因此,如果Natalia执行首个操作,那么在最优策略下Cezary将会获胜,反之亦然:如果Cezary开始,那么Natalia将会获胜。

这对已经排列了前k堆硬币,每堆m枚。现在他们正在考虑如何完成这个硬币堆序列。他们已经得出结论,游戏中没有必要有超过n堆硬币。

帮助他们,对于区间[k, n]中的每个数字d,说出有多少不同的公平的硬币堆序列包含m枚硬币,以他们已经排列的硬币堆序列开始。如果存在i∈[1, d]和j∈[1, m],使得在这两个序列中,第i堆的第j枚硬币在一个序列中是蓝色,在另一个序列中是红色,则认为两个硬币堆序列是不同的。

由于这些结果可能非常大,只需提供它们除以10^9 + 7的余数。

输入

标准输入的第一行包含三个整数n, m和k (1 ≤ n ≤ 32; 1 ≤ m ≤ 24; 0 ≤ k ≤ n),分别表示堆数的限制,每堆中的硬币数以及已经创建的堆数。 接下来的k行包含已经排列的堆的描述;其中第i行包含一个长度确切为m的'N'和'C'的字符串,表示第i堆中从底部开始的硬币的颜色。如果这个字符串的第j个字符是'N',那么第i堆中从底部开始的第j枚硬币是蓝色的。否则,这个字符是'C',那么这枚硬币是红色的。

输出

输出的唯一一行应该包含n - k + 1个整数,其中第i个数字应该是将序列扩展i - 1堆以使最终的堆序列公平的方法数除以10^9 + 7的余数。

示例

对于输入:

3 3 1
CCN

正确的结果是:

0 1 3

对于输入:

2 1 0

正确的结果是:

1 0 2

对于输入:

4 2 4
CN
NC
CC
NN

正确的结果是:

1

示例解释:在第一个示例测试中,如果我们不添加任何堆,那么单元素序列将不会是公平的。我们可以添加堆NNC - 这样的两堆序列已经是公平的。我们可以通过三种方式添加两个堆:[CCN, NNN]、[NNN, CCN]、[NCN, NCN]。

PA Avatar