整体二分总结
整体二分总结
整体二分,就是一种高效离线处理可二分答案的询问的方法,可以代替例如树套树这种高级数据结构。
例题:
题意:多次询问,求子矩阵第\(k\)小数。
思路:先考虑如果只有一个询问,可以二分答案,把矩阵中小于等于\(mid\)的数赋1,大于的赋0,那么如果子矩阵之和大于等于\(k\),那么说明答案不小于\(mid\),反之亦然,这样就可以继续递归下去。同样的,处理很多询问的时候,用二位树状数组维护子矩阵和,把当前子矩阵和大于等于\(k\)的询问传到左区间处理,剩下的传到右区间处理就可以了。
题意:有\(n\)个可重集,有两种操作,一种是把\(x\)插入\(l\)到\(r\)的所有可重集中,一种是查询\(l\)到\(r\)的所有可重集里第\(k\)大的数。
思路:先考虑如果只有一个询问,可以二分答案,把所有\(x>mid\)的插入操作看成给\([l,r]\)区间加1,查询看成求\([l,r]\)的区间和,如果区间和大于等于\(k\)就说明答案在\([mid+1,r]\)中。一般的情况也可以类似处理。
题意:有一个环,每个时刻会有一段区间加\(a_i\),每个点属于一个集合,对于每个集合,求这个集合包含的所有点的和第一次不小于\(lim_i\)的时刻。
思路:先考虑如果只有一个询问,可以二分答案,如果\([1,mid]\)时刻操作玩答案大于\(lim_i\),就说明答案在\([1,mid]\)中,对于一般的情况也是如此。