水珠之耀眼,因其未泛滥

比较 \(naive\) 的。考虑序列分块,块长为 \(B\),尝试让每次修改的影响量级减小。
首先对于散块,考虑直接暴力将修改加到单点上,将修改放进每个点开的一个优先队列中。总共标记的数量是 \(qB\) 的。
那么对于整块,就需要直接将整块贡献掉。考虑对于整块标记,维护一个并查集,指向一个标记连续段的最大值。
那么首先,对于整块修改,先把这个并查集维护下。然后发现会影响的点只有当前 \(mex\) 为当前插入值的集合。
显然不能直接修改这些点。这样修改的复杂度就不对了。
现在希望每次修改都能消掉一次散块标记,这样就可以均摊复杂度正确了。
那么就对每块的每个值域上维护一个 \(fhq-treap\),按照最小的比该集合 \(mex\) 大的散块标记排序。
每次就直接不停判断,更新。如果有标记与当前插入值的标记连续段最大值+1相等,那么就可以去单点修改该集合。
否则,则将其它点,全部合并到当前插入值的标记连续段最大值的 \(treap\) 中。

然后单点修改的话,就直接暴力跳。每次判断能否通过散块标记,或整块标记连续段,向较大值跳。显然次数是 \(qB\) 的。
那么整个算法的复杂度就是 \(O(qB\log B+q\frac{n}{B}\log B)\)
平衡一下可以得到复杂度就是 \(O(q\sqrt n \log n)\),空间是 \(O(q\sqrt n)\)
实现时,可以将 \(treap\) 换成左偏树。虽说删除复杂度不能保证,但很难卡掉,并且常数优异。

posted @ 2023-06-16 12:43  sjcx  阅读(24)  评论(0编辑  收藏  举报