类似静态区间逆序对的题的一些做法

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上最快。

posted @ 2017-09-14 20:07  fjzzq2002  阅读(3018)  评论(0编辑  收藏  举报