莫队.
使用莫队,考虑加入一个数 $x$ 造成的影响,发现需要用到 $x-1,x+1$ 的信息.
需要对每个数维护当前它所在的最大连续区间长度,但修改时可能会修改很多数的答案.
简单粗暴的办法是用线段树维护最大子段和,但多一个 $\log$ ,而且常数比较大,跑不过去.
用 $pre_i,nxt_i$ 分别表示 $i$ 在值域上往左/右走最多有几个数, $pre_i+nxt_i-1$ 可以更新答案.
插入数 $i$ 的时候,用 $i-1$ 的 $pre$ 更新 $i$ 的 $pre$ ,用 $i+1$ 的 $nxt$ 更新 $i$ 的 $nxt$ .
然后再更新 $i$ 所在最长连续区间左端点的 $nxt$ 和右端点的 $pre$ .
中间不用管,因为不可能再在中间插入数,也就不可能再用到它们的 $pre,nxt$ 了.
发现删除操作不好维护,我们可以保证右端点不删除,只可能撤销左端点的插入操作,就可以维护了.
对于 $l$ 在同一块内的询问,若 $r$ 也在这一块内,可以暴力做.
对于 $r$ 在这一块外的,将它们按照 $r$ 从小到大排序.
先将 $L$ 设置为当前块的末尾,右移 $R$ 到询问的 $r$ ,再将 $L$ 左移到询问的 $l$ ,更新答案,再将 $L$ 移回当前块的末尾.
因为插入一个数最多只会影响 $3$ 个数的信息,所以把它们记录下来,移回时撤销,时间复杂度 $O(n\sqrt n)$ .
1 |
|