闲话
一天两场模拟赛 全在模拟抱泠
我的体活
听eafoo说明天早上似乎跑操 整个什么尸气大比拼
彳亍
都在放涩图 但是我没涩图
我有饭的图
于是放一张
小宇宙日和
《关于我为了卡掉爆搜苦思冥想两天造出三组数据把爆搜捏死的这件事》
以及这题的gen.cpp有230多行
望周知
今天在随机题
然后发现某出题团里有一个上琴
然后翻了翻 被上琴甜到不行
咳咳咳我是上茵我要坚持立场
回滚莫队
当时顺着做题单时没写,拿 \(O(n \sqrt n \log n)\) 的暴力莫队艹过去了。
模拟赛模出这道板子题,于是模拟抱泠
回滚莫队是这么一个东西:
我们现在要维护一种信息,加入很方便可以 \(O(1)\) 但是删除可能是 \(O(n)\) 级别的/根本做不了。一般这种信息都有 \(O(\log n)\) 的均摊做法,于是就有了 \(O(n \sqrt n \log n)\) 的普通莫队做法。现在考虑只加入不删除的做法。
首先说做法:
我们打包处理左端点落在相同块内的询问,这些询问按照右端点升序排序。
我们依次处理这些询问。对于右端点落在块内的询问暴力处理后清空。落在块外的部分拆成块外和块内两个部分,块内仍然暴力,块外顺序处理。容易发现这样的操作只进行了加入而不进行单次删除。
细节:先加入块外部分,再记录状态并加入块内部分。因为只会加入 \(O(\sqrt n)\) 个信息因此回退版本是方便的,而且回退后版本就是块右端点到当前询问右端点的信息。
若加入操作的复杂度为 \(O(f(n))\),容易发现此策略的复杂度是 \(O(n \sqrt n f(n))\).
对于落在块内的部分由于询问 \(O(n)\) 单次处理 \(O(\sqrt n f(n))\),因此这部分的复杂度是 \(O(n \sqrt n f(n))\).
对于块外的部分由于顺序处理因此一个块只会加入 \(O(n)\) 次,共有 \(O(\sqrt n)\) 个块,因此这部分的复杂度是 \(O(n \sqrt n f(n))\).
没了
就是长得很奇怪 没了 l--,r++,l++,r--
而多了栈什么的
然后很多题就能拿这个东西优化一下了。
歴史の研究
可以说是回滚莫队板子了吧。
这题要维护一个最大值
如果直接干上去一个堆/线段树维护莫队直接T到飞起
然后考虑回滚
最大值删了不好找?不删
然后直接做就行
Rmq Problem / mex
考虑 mex 的性质。
从序列中加入一个值可能需要直接暴力扫
但是删除只需要比较当前答案和删除值的大小就好
因此反过来整一个不加入莫队
先处理块端到序列尾的答案然后倒着扫回来
复杂度仍然 \(O(n \sqrt n)\)
当然这题有jiry线段树的做法 上界 \(O(n \log ^2 n)\)
就是直接做一个扫描线 然后开线段树维护当前点为左端点 右端点为当前点右侧所有点的答案
每次删除直接做区间取min就行
查询就直接扫的时候查询 比较套路