类似静态区间逆序对的题的一些做法
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上最快。