P11831 [省选联考 2025] 追忆
说实话,是第一道 bitset 题,听段爷讲了一天的根号重构做法没太明白,菜完了/ll/ll
做法来自 wzl 的题解。
由时限入手,发现给了 6 秒,2GB,我们就可以直接拿 bitset 记录下来连通性了,然后做乱搞。
继续看性质,对于性质 \(B\),在 \(b\) 值固定不动的情况下我们可以以 \(b_i\) 的值为下标存到 bitset 里面,然后随机一个 ds 维护就好了。
对于性质 \(A\) 做法相似,在 \(a\) 值不变的情况下我们以 \(a_i\) 的值为下标存到 bitset 里面,然后和连通性的 bitset 与一下,就能得到我们应该维护的下标区间,然后值域分块或者树状数组二分以 \(b_i\) 权值为下标查找最后一个 \(1\) 的位置就好了。
考虑正解,我们把上述两种思路拼起来,发现 \(a_i\) 和 \(b_i\) 的权值如何交换,连通性所存的原始点编号是不会变的,不妨以这个作为媒介,我们一个 bitset 维护可达的点编号,然后一个分块套 bitset 维护以 \(a_i\) 为下标的点编号,存到每一个块的 bitset 里面,分块的作用就是下文的复杂度平衡,再搞一个分块套 bitset 维护以 \(b_i\) 为下标的点编号,那么,我们每次就是去 \(b\) 里面找答案,那么答案的可能位置呢?就是可达点 bitset 在 \(x\) 点下和 \(a\) 的 bitset 在 \([l,r]\) 内的 bitset 与起来的结果,然后再倒着看 \(b\) 内的块,与起来看是否有交就好了,然后找到一个块之后暴力找答案。
对于复杂度,这样维护操作一二都是 \(O(1)\) 的,预处理连通性是 \(O(n)\),我们令块长为 \(B\),那么操作三中散块的复杂度是 \(O(B)\),整块是 \(O(\frac{n}{Bw})\),当 \(B = \frac{n}{\sqrt w}\) 时取最优复杂度 \(O(\frac{n^2}{\sqrt w})\)。
省选联考 2025 D1T2 就这么做完了。。

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号