相似静态区间逆序对的题的一些作法

lxl说能发了,那就发吧数组

bzoj3289 / bzoj3744数据结构

离线作法排序

我会莫队!拓展的时候用数据结构(树状数组)维护!O(nsqrt(n)logn)数据

咱们考虑拓展的时候不插入,直接询问当前区间的贡献。查询

咱们就是要静态支持区间查询<=x的有几个。持久化

考虑这种问题通常怎么作,咱们对值域分块,<=x就变成了一个块前缀和一个块内前缀。

咱们有两种作法,第一种是咱们先跑一遍莫队,找到咱们须要哪些询问。

而后咱们差分一下,变成询问前a个数<=x的有几个,咱们直接把这些询问离线存下来值域分块一下,扫一遍搞完了。O(nsqrt(n))

还有一种作法是直接把值域分块可持久化,只要每次把修改的块拷一遍存下块下标就行了。这种作法可能会快一点,可是空间可能有点爆炸(O(nsqrt(n)))。

在线作法

咱们考虑分块!

除去边界之外,一个询问在分块的眼中是这样的:

零散|整块|整块|整块|整块|整块|整块|整块|整块|整块|零散

咱们来一块一块解决。

块内的逆序对:预处理

块间的逆序对:每块排序完归并

两块零散的逆序对:把这两块零散归并

零散到整块的逆序对:维护值域前缀和

零散内的逆序对:注意到零散的开头或结尾必定是块端点,预处理便可

那么边界就是询问端点在同一块的,假设是[l,r],块开头为w,那么[l,r]的答案=[w,r]的答案-[w,l-1]的答案-[w,l-1]对[l,r]的贡献,继续归并便可

O(nsqrt(n))

目前这个作法在3744上最快。

相关文章
相关标签/搜索