跳至主要內容

ICPC 2024 香港区域赛(Hong Kong Regional)部分题解

Wallbreaker5th大约 6 分钟OI×ICPCOI×ICPCOI×ICPC - 题解OI×ICPC - DPOI×ICPC - 构造OI×ICPC - 均摊分析OI×ICPC - 贪心OI×ICPC - TrieOI×ICPC - 构造

注意

题解写得可能非常抽象。

「如果一个题解你看不懂,那是题解垃圾而不是你垃圾。」

倒闭了,开场看错 K,给 F 想了两个假做法,给 E 想了一个假做法,感觉至少浪费了两个小时的机时。

等上 UCup 再写题解吧(?)。

B. Defeat the Enemies

题意

nn 个敌人,每个敌人有一个血量 aia_i 和盾牌 bib_i。给定序列 c1kc_{1\dots k}。你一个回合可以选一个 1ik1\leq i\leq k,花费 cic_i 的代价,对所有敌人造成 ii 的伤害。一个敌人被攻击时,如果其盾牌为正,则其盾牌减少 ii(可能变为负),否则其血量减少 ii。求最少花费多少代价消灭所有敌人(血量小于等于 00)。m5×105,m104,k100m\leq 5\times 10^5,m\leq 10^4, k\leq 100。3 s。

题解

首先注意到,总的伤害一定比 maxai+bi\max a_i+b_i 大不到 kk。DP,设 f[i,j]f[i,j] 表示现在已经给了 ii 的攻击,目前知道需要的总攻击比 maxai+bi\max a_i+b_ijj。一开始 jj00。而当我们在 ii 的时候做出 kk 的攻击,会导致有的攻击被浪费(把盾牌扣到负数)、它对应的敌人需要的总攻击就会比 ax+bxa_x+b_x 大,这时 jj 需要对这个敌人需要的总攻击取 max\max。当 ii 追上了 maxax+bx+j\max a_x+b_x+j 时,所有敌人都被杀死了。

C. The Story of Emperor Bie

题意

你要搭建出一个给定的正整数序列。你可以初始选定一个正整数,序列一开始只有这个数。然后你一次操作可以选择左/右,在序列的这一端添加一个数,满足其不大于序列另一端的数。问,要搭建出给定的这个序列,有哪些数可能作为初始的数。n5×105n\leq 5\times 10^5

题解

充要条件是这个位置是最大值。充分性考虑逆序做这些操作、总能反复删掉两端较小的一个;必要性考虑每次加的数一定小于等于初始值。

E. Concave Hull

(是的我对哈尔滨那场的计算几何过拟合了套了一个错误结论占了一万小时的机时)

(没有题解)

F. Money Game 2

(是的这题一开始榜被带歪了,我们想了两个假做法)

题意

nn 个人坐成一圈,第 ii 个人初始有 aia_i 块钱。依次操作,一个人可以把他的钱的一半的下取整给旁边的一个人,每个人至多操作一次。现在对于每个人求:他最后最多能得到多少钱。n5×105,ai109n\leq 5\times 10^5, a_i\leq 10^9。4 s。

题解

首先注意到一个人的贡献并非只能传播给 logai\log a_i 以内的人。因为 11 的变动足以让除以二下取整的结果也加 11。进位也不能用简单的判断就解决。

首先,最优答案一定是划定一个分界,分界一侧的人往一个方向依次传、另一侧的人往另一个方向依次传,最后传到收钱的人。

我们不妨先假设收钱的人是 00、只考虑从右边往左传给 00 的。00 收到的钱是 i=1mai2i\left\lfloor \sum_{i=1}^{m} \frac{a_i}{2^i} \right\rfloor。注意到 mm 增长时,前 logV\log V 次这个结果可能增加;而 logV\log V 次之后,这个求和因为是收敛的,结果至多增加 11。我们认为当 mmm1m-1 变到 mm 时,如果这个求和增加了,这个增加是由 mm 造成的贡献。那总的贡献对只有 O(nlogV)O(n\log V) 对。

现在反过来,考虑贡献的来源,我们可以从它出发、向左向右枚举,从而求出它对每个位置的贡献;当贡献变成 00 就停止枚举,从而求出所有的贡献对。贡献对只有 O(nlogV)O(n\log V) 对,所以这样枚举的总复杂度是 O(nlogV)O(n\log V) 的。

接下来,我们若固定分界点,没有跨过分界点的贡献对(注意到我们枚举贡献对的时候,是知道顺逆时针方向的)都是真的有贡献,每个位置的答案就是以它为贡献目标的贡献对的权值之和。我们枚举分界点,每次增删受影响的贡献对,以及更新受影响的位置的答案,总复杂度是 O(nlogV)O(n\log V) 的。

G. Yelkrab

题意

给定字符串 s1,,sns_1, \dots, s_n,对于所有 1in1\leq i\leq nj=1if(i,j)\bigoplus_{j=1}^i f(i,j)。其中 f(i,j)f(i,j) 表示:将前 ii 个字符串分出若干大小为 jj 的组(可能有字符串不在组内),每个组求 LCP,对所有组求 LCP 之和,的最大值。n5×105,si106n\leq 5 \times 10^5, \sum |s_i|\leq 10^6

题解

首先考虑给定 i,ji,j 后怎么求。我们建出字典树,从下往上贪心,能凑出 jj 个串求凑一组。转化一下,可以变成,对于每个节点求 sizex/j\lfloor \mathit{size}_x / j \rfloor 求和(其中 sizex\mathit{size}_x 是以 xx 子树下的字符串数)。

接着我们一个串一个串加入,加入一个串时,会改变一些节点的 sizex\mathit{size}_x,从而某些 jjsizex/j\lfloor \mathit{size}_x / j \rfloor 求和会加一。我们异或掉它们的旧答案、异或上新答案。由于数的约数个数和不大,时间复杂度没问题。

H. Mah-jong

(好像不是我做的)

K. LRString

(是的我们签到题读错题了)

题意

给定字符串 SS,字符集为 {L,R}\{\texttt{L},\texttt{R}\}。你一次操作可以选择一个字符,然后删去它相邻的、L 就是左侧、R 就是右侧的字符。多次给出 TT,询问 SS 能不能操作成 TTS,T106|S|, \sum |T|\leq 10^6

题解

充要条件是:TTSS 的子序列;SS 如果以 L 开头,那么 TTL 开头;SS 如果以 R 结尾,那么 TTR 结尾。

L. Flipping Paths

(是的我们想到了一个麻烦的做法于是没有写出来)

题意

有一 n×mn\times m 的网格,每个格子初始为黑/白。你可以选多条 (1,1)(1,1)(n,m)(n,m)、只向右或向下的路径,每条路径会让其经过的格子颜色翻转。构造不超过 400 条路径,使得所有格子同色,或者判断无解。n,m200n,m\leq 200

题解

从左下开始,依次考虑所有左上-右下的对角线(除去上边、右边的部分)。

a.....
a.....
aa....
baa...
.baa..
..baa.
...baa

例如我们考虑上图中的 b 组成的对角线,注意到我们沿着路径 a 一路走、在需要翻转 b 的时候走 b,其他时候走 a,可以独立控制每个 b 是否翻转。以这个方式可以把除了第一行、最后一列的所有格子变成指定颜色,最后再考虑第一行、最后一列的这条路径即可。外层还要枚举一下最终的颜色。