整体二分

整体二分,顾名思义就是将一些数据放到一起二分(雾

例题


Luogu3834 【模板】可持久化线段树 1(主席树)

静态区间 \(kth\)

\(n,\ m\leq10^5\)

把所有查询、原始数列丢到队列里二分

每次将答案不大于 \(mid\) 的询问、权值不大于 \(mid\) 的原始数列丢到左边,否则丢到右边,并减去丢到左边的原序列对丢到右边的询问的贡献,两边递归下去

时间复杂度 \(O(n\log n\log SIZE)\)


bzoj2738 矩阵乘法

静态矩阵 \(kth\)

\(n\leq500,\ m\leq6\times10^4\)

把树状数组换成二维树状数组就行了,稍有卡常

时间复杂度 \(O((n^2+m)\log^2 n\log SIZE)\)

代码 (这份代码写法很怪、、


Luogu2617 Dynamic Rankings

单点修,区间 \(kth\)\(n,\ m\leq10^5\)

大体思路同上,在队列中把修改也加上,并将将位置 \(x\) 上的数修改为 \(y\) 的修改拆为 \((x,\ lastval,\ -1)\)\((x,\ y,\ 1)\),在整体二分中按三元组中的第三个元素修改贡献,分段时把 \(x\leq mid\) 的修改丢到左边, \(x>mid\) 丢到右边

时间复杂度 \(O(n\log n \log SIZE)\)

代码


Luogu3527 [POI2011]MET-Meteors

给定一个环,每个节点有一个所属国家, \(k\) 次事件,每次对 \([l,\ r]\) 区间上的每个点点权加上一个值,求每个国家最早多少次操作之后所有点的点权和能达到一个值。

\(n,\ m,\ k\leq3\times10^5\)

思路同上,每次对于右边的询问减去当前答案区间 \([l,\ mid]\) 这些询问的贡献,用树状数组维护

时间复杂度 \(O(n\log m\log k)\)

代码


bzoj3110 [ZJOI2013]K大数查询

\(n\) 个位置, \(m\) 次操作,每次将 \([l,\ r]\) 的位置添加一个数或询问第 \(k\)

\(n,\ m\leq5\times10^4\)

整体二分,计算修改的贡献即为区间加,求区间和,用树状数组即可……

时间复杂度 \(O(n\log n\log a_i)\)

代码


bzoj1146 [CTSC2008]网络管理Network

带修树上kth, \(n,\ m\leq8\times10^4\)

思路同 Dynamic Rankings,维护贡献树上差分即可,每次询问还需查询 lca

时间复杂度 \(O(n\log^2 n\log a_i)\)

代码 (开 C++11)


CF1100F Ivan and Burgers

可以用 lxl ST表 暴力艹过去…… link

整体二分做留坑待填……


感觉整体二分是个好东西啊

留坑待填 [doge]

posted @ 2019-03-28 17:49  cnJuanzhang  阅读(214)  评论(0编辑  收藏  举报