整体二分,顾名思义就是将一些数据放到一起二分(雾
例题
静态区间 (kth)
(n, mleq10^5)
把所有查询、原始数列丢到队列里二分
每次将答案不大于 (mid) 的询问、权值不大于 (mid) 的原始数列丢到左边,否则丢到右边,并减去丢到左边的原序列对丢到右边的询问的贡献,两边递归下去
时间复杂度 (O(nlog nlog SIZE))
静态矩阵 (kth)
(nleq500, mleq6 imes10^4)
把树状数组换成二维树状数组就行了,稍有卡常
时间复杂度 (O((n^2+m)log^2 nlog SIZE))
代码 (这份代码写法很怪、、
单点修,区间 (kth) , (n, mleq10^5)
大体思路同上,在队列中把修改也加上,并将将位置 (x) 上的数修改为 (y) 的修改拆为 ((x, lastval, -1)) 和 ((x, y, 1)),在整体二分中按三元组中的第三个元素修改贡献,分段时把 (xleq mid) 的修改丢到左边, (x>mid) 丢到右边
时间复杂度 (O(nlog n log SIZE))
Luogu3527 [POI2011]MET-Meteors
给定一个环,每个节点有一个所属国家, (k) 次事件,每次对 ([l, r]) 区间上的每个点点权加上一个值,求每个国家最早多少次操作之后所有点的点权和能达到一个值。
(n, m, kleq3 imes10^5)
思路同上,每次对于右边的询问减去当前答案区间 ([l, mid]) 这些询问的贡献,用树状数组维护
时间复杂度 (O(nlog mlog k))
有 (n) 个位置, (m) 次操作,每次将 ([l, r]) 的位置添加一个数或询问第 (k) 大
(n, mleq5 imes10^4)
整体二分,计算修改的贡献即为区间加,求区间和,用树状数组即可……
时间复杂度 (O(nlog nlog a_i))
bzoj1146 [CTSC2008]网络管理Network
带修树上kth, (n, mleq8 imes10^4)
思路同 Dynamic Rankings,维护贡献树上差分即可,每次询问还需查询 lca
时间复杂度 (O(nlog^2 nlog a_i))
代码 (开 C++11)
可以用 lxl ST表 暴力艹过去…… link
整体二分做留坑待填……
感觉整体二分是个好东西啊
留坑待填 [doge]