
整体二分
Love_xyh
这个作者很懒,什么都没留下…
展开
-
[CTSC2018]混合果汁
为何要用整体二分,整体二分应该怎样二分,和[POI2011]MET-Meteors十分相像,这里就不再重复。我们现在只需要考虑如何判断每位顾客能否喝到满意的果汁即可。我们二分答案mid以后,将大于等于mid的用线段树维护。怎么维护呢 ?我们按价格建线段树,并在线段树中维护区间总份数,区间总价格这两个值。那么对于一个顾客来讲,如果当前的区间总份数小于他想要的份数,或者是区间最小价格大于他能接受的最大价格,就把该顾客划分到右区间,如若满足则划分到左区间。想要和[POI2011]MET-Meteors一样对原创 2020-08-05 19:06:33 · 463 阅读 · 0 评论 -
[POI2011]MET-Meteors
单调性是显然的,暴力也是显然的:即对于每个国家都进行一次二分答案。复杂度:nm logn考虑对于一整段连续的国家整体二分。在solve的过程中,对于1-mid次陨星雨增加的值,用线段树或树状数组来维护。进行区间累加以后,判断每一个国家是否能在前mid次陨星雨以后收集到相应的陨星。对于能与不能,分别放在左右区间,进行下一步递归。这里注意两个小优化:1.区间修改单点查询的线段树,可以利用差分思想后用树状数组维护。2.对于每次solve,不用一遍又一遍地把1-mid次陨星雨都重新累加一遍。对于之前mid原创 2020-08-05 18:55:09 · 178 阅读 · 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 · 154 阅读 · 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 · 156 阅读 · 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 · 159 阅读 · 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 · 184 阅读 · 0 评论