2026.8.11 总结
F
一道只有证明难的贪心加二分题。
思考时间忘了。
起始和终止时间忘了。
首先我们可以手造一个样例在草稿纸上模拟一下,发现一头牛后面永远取不到礼物了当且仅当这头牛前面有一堆牛互相插队,而且每次都插在它前面。
这是一个重要的性质。
还有一个更容易观察的性质是:当一头牛后面再也取不到礼物时,它后面的牛也被堵死了。
所以不能取到的一定是一个后缀。
这是我们可以想到二分,二分这个后缀的开头位置 \(x\)。
每次 check 如下:
先将 \(x\) 前面的的 \(c\) 值取出来按从小到大排序。
然后记录当前的最后位置 \(now\) 初始等于 \(n - x\) 。
然后每次看一下当前枚举到的 \(c\) 值是否大于最后的值所在的位置,如果是就说明当前二分到的 \(x\) 还能再缩小。
如果到最后都没大于,就说明要扩大。
上面这一坨不会证,感觉不好证啊。
赛时没做出原因就是不会证。
时间复杂度:\(O(n\log{n})\) 。
G
不是特别难,但需要对于 manacher 的下标转换以及半径转换有一些理解。
赛时没调出来。
首先先将 \(s1\) 跑一边 manacher 求出每个位置的最长回文半径。
然后将 \(s1,s2\) 跑一边 kmp 记录下每个匹配的开头位置 \(vis_i\) 为一表示匹配了,否则就是没匹配。
这是显然的。
然后就有一点技巧了。
先枚举回文中心,相信大家学过马拉车的都会枚举奇数回文串的回文中心。
先考虑如何将做过 manacher 的数组的下标转回原数组的下标。
显然,这个东西就是 \((i - 2)/2\) 其中 \(i\) 为做过 manacher 的数组的下标。
然后回文半径如何转为正常的长度?
这个就是 \((r - 1) / 2\) 其中 \(r\) 为做过 manacher 的数组的半径长度。
然后发现一个回文串有可能会贡献多次,就相当于每次将 \(l, r\) 缩短至中点,然后每次统计以 \(l, r\) 为左右端点的回文串对答案的贡献,稍微推一下发现前面的贡献就是:
sum (i - l + 1) * vis[i] // i in [l, mid]
+ sum (r - i + 1) * vis[i] // i in [mid, r]
此时并不需要二阶差分或二阶前缀和,只需维护 \(vis\) 和 \(vis_i * i\) 的前缀和就行了。
但是统计答案是要注意左端点为 \(0\) 时会出现 \(-1\) 的下标,需特判。
还有一个细节:\(\mod 2^{32}\) 可以用 unsigned int 。
赛时没做出原因就是没调出来,下次需注意细节。
时间复杂度:\(O(n)\) 。
H
感觉有点思维啊,正常人第一下想到是在询问的时候做一下操作吧。
但是实际上其实先处理。
考虑将每个怪兽不会逃跑的最小的 \(k\) 二分出来。
可以发现这个 \(k\) 是越小就越容易升级,怪物也就越容易逃跑。
所以可以二分。
而二分的 check 怎么写呢。
设当前枚举到位置 \(i\) ,二分到了一个 \(k\) ,那么这个 \(k\) 可行当且仅当前面所有能打的怪兽除 \(k\) 加一 \(\le\) \(a_i\) 。
然后发现这个前面所有能打的怪兽是一个一维数点,直接一边扫一边数就行了。
每次将这个怪兽的 \(k\) 的上界的位置加一,前面所有能打的怪兽就等于前面的上界小于当前二分的 \(k\) 的怪物的数量。
赛时没做出原因就是没想到。
时间复杂度:\(O(n\log^2{n})\) 。
树状数组上二分可以做到单 \(\log\) 懒得想了。
I
好像是一个神秘 dp 状物,不会,我糖丸了。

浙公网安备 33010602011771号