CF765F Souvenirs
CF765F Souvenirs
先观察题目要求:静态区间查询,不强制在线。由此想到使用莫队来解决本题。
容易发现,将一个子串排序后,其答案的候选项只有相邻两项之差。最暴力的方式是用 multiset 来维护查询区间内的所有数。最后更新答案需要遍历整个 multiset,时间复杂度为
考虑在扩展莫队区间的同时更新答案。由于更新答案的方式是取最小值,撤销时难以处理,需要用到回滚莫队。时间复杂度为
由于插入的数一定是 bitset 维护莫队区间。具体地,若 bitset 中其排名的相应位置为 _Find_next 函数可以找到后继 bitset 记录倒序的信息,然后 _Find_next 即可。这个做法时间复杂度为
让我们来思考一下这个做法的瓶颈。对于一个长度为 bitset,每次 _Find_next 的时间复杂度为 _Find_first 函数(返回 bitset 中第一个
还有一些说明:
- 上面的文字结合相应代码来阅读更容易理解。
- 值域块长
l 设定为\sqrt{n} 没有什么依据,但是可以过,换一个数可能过不了。使用严谨的数学推导求最优块长对于这个做法并不适用,毕竟_Find_first和_Find_next的时间复杂度太玄学了。 - 离散化的时候不要去重,否则答案为
0 时不好处理。 - 对于值域分块,更新块间答案的时候不能只考虑相邻的两个
bitset,有可能隔着几个空的bitset更新答案。 - 注意空间的问题,不要把
bitset开太大,否则清空会很费时间。