整体二分总结
整体二分,就是一种高效离线处理可二分答案的询问的方法,可以代替例如树套树这种高级数据结构。
例题:
题意:多次询问,求子矩阵第\(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]\)中,对于一般的情况也是如此。
题意:有\(n\)个区间和\(m\)个操作,每个操作会把所有覆盖了\(x\)的区间的权值+1,每个区间有一个参数\(lim\),求出每个区间的权值第一次到达\(lim\)的时刻。
思路:发现题意就是单点加,和查询一个区间和第一次到达\(k\)的时刻,于是考虑整体二分,用树状数组实现单点加和区间查询即可。
5.P7560 [JOISC 2021 Day1] フードコート
题意:有\(n\)个序列,标号从\(1\)到\(n\),有3种操作,一是给区间\([l,r]\)内的每个数列后面加入\(x\)个数\(k\),二是把\([l,r]\)内每个数列的前\(k\)个数删除,三是查询第\(x\)个数列的第\(k\)个数。
思路:发现求出每个查询对应的\(k\)是不算第二种操作时的第几个数,就可以直接用静态区间第\(k\)小的思路求解。于是问题转化为了怎么求是第几个数。可以很简单的转化为:总共来过的人数-当前还剩的人数+\(k\),而求出当前还剩的人数可以用线段树维护(区间加,区间取\(max\)),于是就做完了。
标签:二分,总结,题意,矩阵,mid,整体,区间,查询 From: https://www.cnblogs.com/Xttttr/p/17392201.html