ICPC 2024 成都区域赛(Nanjing Regional)部分题解
注意
题解写得可能非常抽象。
「如果一个题解你看不懂,那是题解垃圾而不是你垃圾。」
比赛链接:UCup、Codeforces Gym
A. Arrow a Row
题意
定义一个箭头串为 >-...->>>
(-
有一个或多个)。一个初始串长为 ,全为 *
;一次操作可以将一个子串覆盖为一个箭头串。在 次操作内把初始串变为给定串,或无解。。
题解
目标串一定是开头若干个 >
、中间包含一些 -
和 >
,结尾至少三个 >>>
。先处理结尾的连续 >
,每次覆盖 、、……、。接着 的部分全是 -
、通过覆盖 ,可以把 单独这个位置的 -
覆盖为 >
。
B. Athlete Welcome Ceremony
题意
有一个 abc
构成的串,部分位置未知。多次询问,每次给定 ,问往未知部分填进不超过 个 a
、不超过 个 b
、不超过 个 c
,且满足相邻两个字符不相同的方案数。。
题解
先 DP 前 个字符用 个 a
、 个 b
、结尾字符是 的方案数。DP 完后求三维前缀和即可 查询。
D. Closest Derangement
题意
给定排列 ,定义排列 是好的当且仅当 是 的一个错排且 取到最小值。求所有好的排列中字典序第 小的排列。。
题解
首先考虑 长成什么样。 为偶数时,最优解为 对应 、 对应 、 对应 、 对应 ,且是唯一的最优解。
为奇数时,我们无法做到每个差都为一,但最优解中只会有恰好一个 指向 、 指向 、 指向 的情况(或者反着指),因此 只有 个左右。特别地,若我们强制要求 ,简单讨论可以发现满足这一点的 一定是一个区间(反着指会另外需要记录一个区间)。因此我们从头开始依次枚举 的每个数是多少,通过判断【两个双区间求交的大小】可以判断出每个数。
K. Magical Set
题意
有 个正整数,构成一个集合。一次操作可以把一个正整数变为它的一个非本身的因数,维持所有数互不相同。问至多能做多少次操作。。
题解
首先,问题可以转化为给每个原正整数选一个约数,约数互不相同,使得约数的质因数个数之和尽量小;因为我们可以将一个数每次去掉一个质因数达到选定的约数,如果集合里有其他数阻挡,可以把阻挡的数连通当前正在想操作的数一同去掉一个质因数,其等价于把原本要操作的数穿过那些阻挡的数到达目标约数。
然后怎么最大流或者最优匹配一下即可,但 CF 上数据加强过,不知道怎么过。