2025.4.8 模拟赛
4.8 模拟赛
很板很奇怪的一场...
railway
显然应该拓扑排序然后 dp(u,v) 同时走两条路,每次走一步,强制不相交。
但是开场扔一个神秘的网络流找最短路上去就过了...于是就扔那没管了。
brick
想复杂了...
开局想了一些最长上升子序列的暴力,然后就没法优化了。
其实这个三元组限制很松,可以进行一些暴力的维护。
看到区间 flip 想平衡树,接下来考虑维护这些信息。
对于 \(x\) 的子树,我们可能左边取一个,右边取两个/左边取两个,右边取一个 ……
于是维护 \(mnv,mxv,mnp,mxp\),后两个指上升二元组最小 sec / 最大 fir。
如果这个子树 ok,我们其实就不关心这个子树整体的 \(mnp,mxp\) 了,因为这样全局就 ok 了。
而且显然如果用上面那些组合都不 ok,那么一定就不 ok 了。
所以只需考虑维护子树内不 ok 时,跨越左右子树的二元组 \(mxp,mnp\)。
如果子树不 ok,那么对于任意位置 \(p\),它右边的比它大的数组成的序列一定单调递减,否则就 ok 了。同理左边比它小的数也一定单调递减。
于是我们就可以二分出 最小的比它大的数 和 最大的比它小的数,更新 mxp 和 mnp。
整体复杂度应该是 \(O(nlog^2 n)\) 左右。
perm
前两天讲课刚讲过,这种模型就是把每个字符替换成到上一个相同字符的距离。
求不同子串数量一般用 SA,但是有修改,于是一般的后缀排序算法都不能用,考虑直接套快速排序,这样只需实现两个后缀间的比较函数。
正常字符串比较是二分+哈希求 lcp,比较 lcp+1。但是这道题有一些位置会修改,不能直接哈希。但是发现最多只有 \(O(\Sigma)\) 个位置会被修改成 0,于是把这些位置拿出来,其他部分分段哈希,碰到哈希值不同的段就二分是哪个位置不同。这样复杂度就是 \(O(n\log n(\Sigma+\log n))\) ,可以通过,但是需要卡常。

浙公网安备 33010602011771号