整体二分
作者:互联网
\(\quad\)这个就是对于所有询问一起二分答案。一般的格式是 solve(值域,操作范围)
,表示在这个操作范围内,所有的操作都是涉及这个值域的(答案在这个值域,加减在这个值域),并且按照顺序排列。那么求解的大概的过程就是,对于当前值域二分一个答案,扫一遍,对于涉及的数值比这个二分的值小的操作就放在一个队列中,否则放在另一个队列中,最后重新对操作范围赋值,递归求解。
\(\quad\)对于值域二分时可以考虑二分出现过的数字,因为答案只可能出现这些数字,这样应该可以减少常数。
\(\quad\)这个就是一道整体二分的模板题,扫一遍的时候,对于涉及到左边值域的加减操作,就在树状数组中操作一下,对于查询操作,就可以直接在树状数组中查询,看左边的值域是否满足要求,然后看情况将其放入队列中。
\(\quad\)复杂度显然是产生在树状数组中,也就是 \(O(mlogV)\)
\(\quad\)乍一看没什么思路,考虑如果只有一个人,那么二分一下,然后按照价格贪心的取即可。注意到,可以二分,那么我们考虑整体二分。我们需要维护一个以价格为底的线段树,每一个节点保存最大体积和相应的价格,因为我们贪心的时候一定是从小往大的贪,所以一定可以用线段树二分出是否满足要求。那么对于每一个区间,二分一个美味值,然后将满足条件的美味值的价格插进线段树中,对于每一个区间内的人,用线段树判断一下即可。常数似乎是非常的大,不过范围只有 1e5 ,可以过。
标签:二分,对于,值域,线段,整体,quad,操作 来源: https://www.cnblogs.com/kzos/p/16388943.html