20260117 - 期末测验 总结

我为啥只是个 rk3 啊这么菜的吗。


A - ±1 Operation 2

哇哦第一道就是以往的 ABC D 题,难度上来了喔!

水题。显然所有小于 \(X\) 的 \(a_i\) 就只会使用加法操作,所有大于 \(X\) 的 \(a_i\) 就只会使用减法操作。考虑对 \(a_i\) 排序然后求前缀和,对于每个询问的 \(X\) 二分查找 \(a\) 序列中第一个大于 \(X\) 的位置 \(p\)。记 \(\sum_{i=1}^{p-1} a_i = S\),\(\sum_{i=p}^{n} a_i = T\),则这次询问的答案为 \(x(p-1)-S + T-xp\)。

注意到与 \(X\) 相等的 \(a_i\) 不管是放在 \(S\) 还是放在 \(T\),哪一边都是可以的。

完了 T1 就是黄,怎么一个签子也没有啊?!

B - Fedor and New Game

奇了怪了,T1 黄 T2 橙,这顺序认真的吗??

求二进制有几位不同,考虑做异或 \(\oplus\) 运算后求 \(\text{popcount}\),看是否 \(\le k\) 即可。时间复杂度 \(O(nm)\)。

C - Road Reduction

发现可以从节点 \(1\) 出发跑 Dijkstra,每次更新 \(dis\),只要遇到更优的就更新,这样最后跑出来的总是一棵树的形态,满足题目要求。对于每个除了 \(1\) 的点记录过来的边,之后输出即可。

注意到这是一个有赛后 Hack 的 ABC E 题,我们需要再 Dijkstra 里加一句剪枝:如果当前取出的堆顶 \(u\) 所对应在堆里存储的路径长度 \(d\) 与实际上 \(u\) 对应的路径长度 \(dis_u\) 不符,就直接跳过这一段。这样能节省时间,不然你会在 Hack 上 T,这便是我那一发罚时的由来 /kel

D - Air Conditioners

水题来着。所以 hhy 到底作弊没有。

题目说的很明白了,虽然题面很长(但大多都是在举例子讲废话喵!),简单地说就是找所有空调中,温度加上与该位置的距离的和的最小值。

考虑使用一些,类似模拟,或者说是 DP 的递推东西来解决这个玩意儿。定义 \(dp_i\) 表示单元格 \(i\) 的温度,最初有所有 \(dp_i = \infty\),但是 \(dp_{a_i} = t_i\)。

接着考虑正着反着各推一遍,正着时让 \(dp_i = \min(dp_i , dp_{i-1} + 1)\),反着时同理,让 \(dp_i = \min(dp_i , dp_{i+1} + 1)\),因为空调温度不会变但距离总之要 \(+1\)。

最后求出的 \(dp_i\) 就是单元格 \(i\) 的准确温度了,直接输出即可。

E - Fools and Roads

非常开心地拿到了首 A。

发现该题的图为一棵树,然后所谓傻瓜们走的是简单路径,即,我们只需要找到 \(\text{LCA}\) 然后树上差分维护最后跑一通 DFS 还原答案即可。

注意这里要处理的是边的经过次数不是点,并且需要存边的编号。

F - Palindromic Partitions

考虑贪心,从最前面和最后面开始找,从小到大枚举串的长度,一旦匹配上了就缩进,到了中间继续找。

发现是否匹配这一步骤可以使用 Hash 来判断,用双指针做,均摊 \(O(n)\) 没任何问题。然后你就过了。

G - Magic Ship

开心地签下了首 A 并成功场一道 *1900,开心喵。

发现当你知道现在能航行 \(D\) 天的时候是非常好做的,先利用前缀和与余数求出只靠风向在这 \(D\) 天后会跑到哪里去,然后将这个位置与正确的位置求曼哈顿距离,只要这个距离不超过 \(D\),该天数 \(D\) 便可行。

显然该问题存在单调性,如果航行 \(D\) 天到不了,那航行 \(D-1\) 天肯定更到不了;如果航行 \(D\) 天能到,那航行 \(D+1\) 天肯定也到得了。于是就可以考虑二分答案了,check 函数是好写的,上面已经讲完了,只需要在最开始预处理维护个前缀和即可 qwq。

H - Yet Another Yet Another Task

我如果切出来了,我就是 rk1 吧!

看似轻松地说出这句话但内心是绝望的。为什么啊啊啊啊啊啊啊 TAT

注意到卡牌价值的数据范围特别小,启发我们可以从这个值域方面下手。

注意到一段区间最终的价值一定是该区间的区间和减去该区间内最大的数值。这启发我们通过这小得可怜的数据范围来枚举这个区间内最大的数。

具体怎么个枚举法呢?我们先枚举区间内最大的数 \(x\),然后用一个 \(sum\) 不断记录,\(i\) 从 \(1\) 遍历到 \(n\),每次都让 \(sum \gets sum + a_i\),但是如果 \(a_i > x\) 就要立马 \(sum=0\)。每次 \(sum\) 也都要和 \(0\) 取 \(\min\),因为宁可一个不选也不要出现负数,这样只会让结果更差。然后尝试用 \(sum-x\) 更新答案即可。

我们又能发现一件事,枚举 \(x\) 也就是这个区间最大值的时候可以考虑只枚举正数,因为最大值都是负数了的话和肯定也不会超过 \(0\),不如随便单独选个数好,没必要为此浪费时间。虽然就是说也用不了多少时间。

I - LCM is Legendary Counting Master

注意到

\[\dfrac{1}{\operatorname{lcm}(a_1,a_2)} + \dfrac{1}{\operatorname{lcm}(a_2,a_3)} + \dots + \dfrac{1}{\operatorname{lcm}(a_{n-1},a_n)} + \dfrac{1}{\operatorname{lcm}(a_n,a_1)} \]

\[= \dfrac{\gcd(a_1,a_2)}{a_1 a_2} + \dfrac{\gcd(a_2,a_3)}{a_2 a_3} + \dots + \dfrac{\gcd(a_{n-1},a_n)}{a_{n-1} a_n} + \dfrac{\gcd(a_n,a_1)}{a_n a_1} \]

\[\le \dfrac{a_2 - a_1}{a_1 a_2} + \dfrac{a_3 - a_2}{a_2 a_3} + \dots + \dfrac{a_n - a_{n-1}}{a_{n-1} a_n} + \dfrac{{\color{blue} a_1}}{a_n a_1} \]

\[= \left ( \dfrac{1}{a_1} - \dfrac{1}{a_2} \right ) + \left ( \dfrac{1}{a_2} - \dfrac{1}{a_3} \right ) + \dots + \left ( \dfrac{1}{a_{n-1}} - \dfrac{1}{a_n} \right ) + \dfrac{a_n}{1} \]

\[= \dfrac{1}{a_1} \]

\[\le 1 \]

也就是说,题目可以转化为,求对于任意 \(1 \le i < n\) 都有 \(\gcd(a_i,a_{i+1}) = a_{i+1} - a_i\) 且 \(a_1 = 1\) 的数列 \(a\) 个数。

注意到 \(\gcd(x,y) = y-x\) 这个条件表示 \(y-x\) 是 \(x\) 的因数,即存在 $d \mid x $ 使得 \(x + d =y\),于是这样的二元组 \((x,y)\) 个数最多只有 \(O(m \ln m)\) 个,于是简单 \(O(n m \ln m)\) DP 即可得到答案。

总结

唯一可惜的点就是没把 H 干出来。陷进 ST 表的坑里出不来了。

看来还是要注意跳脱固定思维。框死在里面真的很浪费时间。

其实这个 I 我不指望我赛时能推出来这个式子来着……但是确实很巧妙对吧!

继续加油吧!/fendou

posted @ 2026-01-19 20:38  嘎嘎喵  阅读(68)  评论(0)    收藏  举报