P5906 【模板】回滚莫队&不删除莫队 题解

Part1.自己一开始是怎么想的

确实感觉到了不好回退,我并不会回滚莫队,所以并没有想出来。

Part2.正解是怎样的

首先把左端点在一个块内的单独考虑,因为不能回退,首先把左端点 \(l\) 放置到当前块的右端点。然后右端点也放到这个地方。在一个一个处理区间询问的时候,右端点是单调递增的,右指针 \(r\) 一直不会回退。这个时间复杂度是 \(O(n)\) 的。然后暴力处理左端点右端点在同一个块内的。我们一直存着 \(tmp1\) 表示块的右端点到当前右指针的答案。对于每个查询,暴力回退左指针到查询的左端点,这不是回退而是另一种方向的拓展。然后统计 \(tmp2\) 表示左边这个小区间自己的答案和左边的点到右边的小区间合在一起的答案,取一个最大值即可。每次暴力回退的最大时间复杂度是 \(O(\sqrt n)\) 的。总时间复杂度是 \(O(n\sqrt n)\) 的。

Part3.差在哪里,如何解决?

没有利用到这种性质,想不到暴力跳转左端点的时间复杂度其实是对的。

Part4.编码的困难、调出来的错误

没有,调出来的错误主要是没有及时更新ed数组(表示一个数字最后出现的地方),就是忘记写了,要注意。

Part5.收获有什么

更能好好利用莫队的性质了,要巧妙利用性质,收获就是会了回滚莫队。

Part6.时间主要花在哪里了

主要花在理解回滚莫队的思路上了,题解讲得不是很明白,想了很久的话就要及时看看代码。

posted @ 2025-04-07 09:57  Ruan_ji  阅读(232)  评论(0)    收藏  举报