[省选联考 2025] 追忆 题解
小丑来改省选题了
首先发现问题不弱于求导出子图,复杂度大概就是 \(O(\dfrac{n^2}{w})\) 的样子
一
先说一个大常熟做法,胜在简单
考虑特殊性质
容易发现性质C看起来就非常可做,去掉了 \(l,r\) 的限制使得我们拥有足够的复杂度去做后面的东西
考虑对操作分块:先bitset预处理出一个点可达的所有点,把修改全当成赋值,对于块内的查询直接暴力查看是否有贡献就好了,然后将所有修改位置置为 \(0\),在dag 上跑一遍 dp 即可得到答案,复杂度显然是 \(O(\dfrac{n^2}{w}+n\sqrt n)\)
我们看看这个做法还能不能拿到更高的分
后面的东西里面都有区间,尝试对 \(a\) 进行分块,重构的时候每次求出连续的一段 \(a\) 对当前点的贡献
如果暴力做这个东西的话会比刚才多个块数(要跑块数遍)复杂度是 \(O((n+m)\dfrac{n}{B1}\dfrac{q}{B2}+q(\dfrac{n}{B1}+B1+B2)))\) 的
因为 \(n,m,q\) 同阶,把柿子写好看点就得到了 \(O((\dfrac{n^3}{B1B2}+\dfrac{n^2}{B1}+nB1+nB2)))\) 的
容易发现只要取 \(B1=B2=n^\frac{2}{3}\) 即可获得 \(O(\dfrac{n^2}{w}+n^\frac{5}{3})\) 的复杂度,算出来应该是可以通过的,不过可能需要卡常,期望得分 \(88\sim 100\)
但是我场上以为这个东西是 \(O(n^2)\) 的,没仔细分析复杂度,没有调块长,甚至改题的时候也没想到这个东西,还强行上了个值域分块和bitset
二
接下来是一个真的需要值域分块和bitset的做法,复杂度是 \(O(\dfrac{n^2}{w}+n\sqrt{n})\),并且是在线做法,薄纱上面做法
首先肯定依然需要对 \(a\) 进行分块,这回我们换个方向来做,从 D 性质入手
D 性质意味着我们不再有数组 \(b\) 了,只剩下 \(a\),要求的就是询问的 \(a\) 区间与可达点的交集中最大的 \(a\) 权值
那么现在我们可以使用 bitset 存每一块中的点所对应的标号,之后从大到小遍历每一块,如果和可达点有交,证明答案一定在这一段内
暴力去做的话复杂度是 \(O(\dfrac{n^2}{w}\sqrt{n})\) 发现复杂度瓶颈在于遍历所有整块,而且一个事实是修改是 \(O(1)\) 的
那么我们发现可以维护各个块的后缀和,之后在整块上二分即可做到 \(O(\sqrt n)\) 修改 \(O(\dfrac{n^2}{w}\log\sqrt{n})\) 回答询问
这时候已经可以通过性质 D 了,考虑扩展
发现同时有 \(a\),\(b\) 的时候可以对 \(a\),\(b\) 同时分块,然后同时维护上面那个东西(合法的点的集合),因为是排列,所以 bitset 是可以差分的,查询和可达点的交就是 \(O(\dfrac{n^2}{w})\) 的,后面半部分在 \(b\) 上做就好了
为了通过所有数据,我们还需要去掉那个 \(\log n\),发现在后缀和的形式中交一定是单调的
初始认为答案在第0块,手写bitset,遍历每一位,如果当前下一块的这一位的 ull 和这个和上面的合法的点有交,说明答案一定在下一块或者更后面的位置,指针加,否则的话说明bitset前面的点不会有其他贡献
这样的话查询只需要遍历整个bitset,复杂度 \(O(\dfrac{n^2}{w}+n\sqrt{n})\)