回滚莫队.
若直接用莫队处理,插入时需要先二分找出它的前驱后继,时间复杂度 $O(n\sqrt n \log n)$ .
但删除是不需要二分查找的,用链表维护好它的前驱后继,直接断掉就可以了.
于是我们可以用回滚莫队来做,就只有删除和撤销两个操作.
具体来说,把所有询问按照左端点所在块为第一关键字,右端点为第二关键字排序.
对于所有左端点所在块相同的询问,按照右端点递减的顺序一起处理.
初始时将左端点设为该块最左侧,右端点设为 $n$ ,处理询问时,将左右端点移过来,回答后再将左端点移回去.
移回去时,暴力撤销移过来的每步操作即可,切换块时,把右端点移回 $n$ ,左端点移到下一个块的最左侧.
预处理出 $1\sim n$ 形成的凸包中,每个点的前驱后继,跑莫队时就只有删除和撤销操作了.
时间复杂度 $O(n\log n+n\sqrt n)$ .
1 | //%std |