![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
整体二分
Love_xyh
这个作者很懒,什么都没留下…
展开
-
[CTSC2018]混合果汁
为何要用整体二分,整体二分应该怎样二分,和[POI2011]MET-Meteors十分相像,这里就不再重复。 我们现在只需要考虑如何判断每位顾客能否喝到满意的果汁即可。我们二分答案mid以后,将大于等于mid的用线段树维护。怎么维护呢 ?我们按价格建线段树,并在线段树中维护区间总份数,区间总价格这两个值。 那么对于一个顾客来讲,如果当前的区间总份数小于他想要的份数,或者是区间最小价格大于他能接受的最大价格,就把该顾客划分到右区间,如若满足则划分到左区间。 想要和[POI2011]MET-Meteors一样对原创 2020-08-05 19:06:33 · 416 阅读 · 0 评论 -
[POI2011]MET-Meteors
单调性是显然的,暴力也是显然的:即对于每个国家都进行一次二分答案。复杂度:nm logn 考虑对于一整段连续的国家整体二分。 在solve的过程中,对于1-mid次陨星雨增加的值,用线段树或树状数组来维护。进行区间累加以后,判断每一个国家是否能在前mid次陨星雨以后收集到相应的陨星。对于能与不能,分别放在左右区间,进行下一步递归。 这里注意两个小优化: 1.区间修改单点查询的线段树,可以利用差分思想后用树状数组维护。 2.对于每次solve,不用一遍又一遍地把1-mid次陨星雨都重新累加一遍。对于之前mid原创 2020-08-05 18:55:09 · 149 阅读 · 0 评论 -
[ZJOI2013]K大数查询
区间求第k小,变为了区间求第k大。 那么现在,对于插入数的结构体来说,如果q[i].k>mid,就把它划分到右区间,并进行单点累加;如果q[i].k<=mid,则划分到左区间。而对于查询的结构体来说,如果查询区间内的值,记为sum,当q[i].k>sum时,可知是由于mid不够小的缘故,所以应该把mid再变小写,即划分到左区间;当q[i].k<=sum时,说明mid已经够大了,所有划分到右区间。 这里的划分,和求第k小相比,好像不是那么“显然”与“对称”了,所以需要注意。 #incl原创 2020-08-05 18:27:44 · 106 阅读 · 0 评论 -
[国家集训队]矩阵乘法
与静态kth的做法可以说是一模一样,计数改为用二维树状数组即可。 #include <bits/stdc++.h> #define lowbit(x) x&(-x) using namespace std; int n,m,x,a,b,c,d,k,minn,maxn,cnt; int sum[505][505],ans[60005]; struct node{int id1,id2,id3,id4,id,k,opt;}q[310005],q1[310005],q2[310005]; i原创 2020-08-05 18:19:35 · 109 阅读 · 0 评论 -
洛谷 P2617 Dynamic Rankings
整体二分做法: 对于序列中原数,与静态kth的做法一样;对于修改的点,我们可以把它拆为两个部分:修改前和修改后,修改前的权值赋为-1,修改后的权值赋为1,然后就与静态kth一模一样了。 注意一个误区:一开始我在想是不是要考虑修改操作与查询操作的时间顺序,其实我们就按照Q次询问的顺序,不断累加封装好的结构体即可。因为无论solve中怎么分治,修改操作与查询操作的相对顺序是永远不会改变的。 #include <bits/stdc++.h> #define lowbit(x) x&(-x) u原创 2020-08-05 17:30:58 · 110 阅读 · 0 评论 -
洛谷 P3834 【模板】可持久化线段树 2(主席树)
整体二分做法: 所谓整体二分,就是把一整块的询问放在一起进行二分答案,这是因为如果对于每个询问,单个单个二分求值的话肯定会超时。那么我们怎么把一整块的询问放在一起进行二分答案呢? 首先对于数组中原来的数和询问,把它们封装在一个结构体中,这个结构体包括x,y,k,id,opt等。(可能对于更复杂的题还需存储一些其余的值) 对于数组中原来的数,我们发现y,k是没有作用的,x代表的是这个位置的数的大小,id表示数的位置,opt是它的类型。 对于询问,x,y,k表示在区间x~y中查询第k小的数,id表示的是询问的编原创 2020-08-05 16:21:08 · 144 阅读 · 0 评论