二分
DOFYPXY
这个作者很懒,什么都没留下…
展开
-
[BZOJ2547][CTSC2002]玩具兵 二分图匹配+spfa+二分
首先可以把每次使用超能力交换棋子看成改变兵种,因为步兵和骑兵个数相同。所以每个兵到每个目标格的最少超能力次数是可以先spfa出来的。天兵的位置其实并不重要,而且每用一次超能力可以用天兵让一个其他兵直达目标格(就是天兵先到那里,然后交换)。所以每次二分超能力次数lim,然后对距离<=lim的边求最大匹配ans,若ans+lim>=2*k,那么lim就是合法的。代码:type node=record原创 2017-05-01 20:35:50 · 479 阅读 · 0 评论 -
[联合集训6-9]Congroo 二进制分组+凸包上二分
查询叉积最大值就是找该向量切凸包上的切点。因为只有在末尾加入删除的操作,我们利用二进制分组,维护loglog\log个凸包,询问的时候在每个凸包上二分找切点即可。 要注意要分别对上下凸壳二分,因为凸包是一个环但二分其实是对一个序列二分,所以直接二分会挂。 程序里还有几个复杂度不对的地方: 1. 二进制分组应该有四个相同的才把前两个合并,而不是有两个相同就合并,否则每次加入/删除第2k2k2^...原创 2018-06-14 20:29:18 · 644 阅读 · 0 评论 -
[联合集训6-19] K小数查询 分块+二分答案
有一种常数比较小的O(nn−−√log2n)O(nnlog2n)O(n\sqrt n \log^2 n)的做法。 分块,每个块维护一个其中元素排好序之后的数组。修改的时候零散块直接重构,整块打标记。询问的时候先二分答案midmidmid,那么就转化成求小于等于midmidmid的数的个数,对于零散的块重构后暴力数,整块的如果标记≤mid≤mid\le mid答案就是块大小,否则直接在数组上二分...原创 2018-06-21 21:36:58 · 362 阅读 · 0 评论 -
[JZOJ5727] [色]和[流泪]||
我们把把一个游戏看成在二维平面上玩,一开始在(0,0)(0,0)(0,0),从左边删x+1x+1x+1,从右边删y+1y+1y+1。 那么假如左边删xxx个,右边删yyy个,那么SG(x,y)=0SG(x,y)=0SG(x,y)=0,我们称之为终止态,那么和终止态相邻且不为终止态的点SG=1SG=1SG=1,称其为边界态。 不难发现对于一个xxx,终止态只有一个,而且随着xxx增大yyy是单调...原创 2018-05-24 11:05:06 · 397 阅读 · 0 评论 -
[JXOI2018]排序问题 二分
题面 考虑一个长度为nnn的序列Gobo Sort之后有序的期望尝试次数是n!a1!a2!...n!a1!a2!...\frac{n!}{a_1!a_2!...} 其中aiaia_i表示iii在序列中出现的次数。 那么就是我们可以把mmm分配给al,..,aral,..,ara_l,..,a_r ,使得∏ri=lai!∏i=lrai!\prod_{i=l}^r a_i!尽可能小。 注意到一...原创 2018-05-04 16:05:46 · 508 阅读 · 0 评论 -
[LOJ2274][JXOI2017]加法 二分答案+优先队列
大概思路就是:先二分答案xx,check就是从左往右扫,如果当前值不足xx,就贪心地不断选右端点最右的给它加上,然后用线段树\树状数组维护区间加,或者直接用优先队列维护加的次数即可。 具体地,开两个优先队列Q,HQ,H,前者维护当前可选区间的右端点最大值,后者维护当前已选区间左端点最小值,然后从左往右扫到ii: 1. 把左端点位于ii的区间加入QQ。 2. 把左端点小于ii的从HH里扔掉。原创 2018-01-23 21:56:56 · 879 阅读 · 0 评论 -
[BZOJ1109][POI2007]堆积木 DP+二分
考虑转移f[i]=max{f[j]}+1当(1<=ai-aj<=i-j) 于是我们把a数组按ai为第一关键字,i-ai为第二关键字升序排序,这样只要满足i-ai>=j-aj更新。就可以然后维护d[],d[k]表示长度为k时i-ai最小为多少,对于每个i二分查找最优决策,然后再把自己的值假如决策集合即可。 代码:#include <cstdio>#include <algorithm>usin原创 2017-10-26 07:55:04 · 426 阅读 · 0 评论 -
[2017纪中11-1]背包 二分
题面 先考虑数据随机。先把物品排好序,每次二分出买的那个价格最大的物品,因为数据随机,买不了多少个就没钱了。 但构造的数据可以卡,于是考虑预处理一个价格前缀和,每次像之前一样二分出能卖的右端点R,然后在二分一个能取走的最长区间[L,R],一次把他们去玩。可以证明这样复杂度是O(nlog^2n)的,因为每次剩下的钱至少变成原来的一半。设钱数为M,[L,R]的价格和于M-C,假设M-C>M/2,那么原创 2017-11-02 15:13:38 · 347 阅读 · 0 评论 -
[BZOJ2525][Poi2011]Dynamite 二分答案+贪心+树型DP
先二分一个最短时间t,判断是否在最多选D个的情况下满足。 每个点设一个权值w,w<0表示其子树中(最远的未能在t时间引燃的炸药的离它的距离+1),w>0表示其子树中(炸药全部能引燃,而且还可以向上传递剩余的时间+1),w=0表示子树全部引燃但已经没有向上剩余。 设mxt表示其儿子中w的最大值,mit表示最小值,f[i]表示当前情况下子树中最少需要的引燃点数,转移如下: if(mxt>=-m原创 2017-10-30 20:03:04 · 407 阅读 · 0 评论 -
[2017纪中10-30]Matrix 二分答案+数论
题面 80pts考场做法: 考虑每个数在矩形中的出现次数。x的出现次数为max(0,x的<=m的约数个数+x的<=n的约数个数-x的约数个数),不妨设n>=m,而且询问的k<=max(n,m)=n,x肯定也<=n。所以x的出现次数即为x的<=m的约数个数。把每个数的约数表预处理出来,再搞个前缀和什么的。对于每个询问二分查找lower_bound一下即可。 代码:#include<iostrea原创 2017-10-30 18:58:02 · 468 阅读 · 0 评论 -
[2017纪中10-28]序列操作 贪心+线段树/二分
题面 显然每次操作贪心对最大的c[i]减一是正确的。但如果从大到小排序,减前面c[i]个并不能保证有序。例如4,3,2,2,2,1,c[i]=3,减得4,3,1,2,2,1。我们应该把第c[i]个数求出来,>c[i]的照常减,=c[i]的优先减靠右的即可。线段树维护。 听说还可以二分? 代码:#include<iostream>#include<cstdio>#include<algori原创 2017-10-30 07:42:01 · 491 阅读 · 0 评论 -
[2017纪中11-6]奇怪的队列 树状数组+二分/线段树
题面 考虑先按高度排序,那么第i位置的人一共有n-i个人比他高,为了方便,这个人报的数字t=min(t,n-i-t)。 那么从小到大把这些人放进序列里。每次放在当前序列t的位置上,然后把这个位置删除即可。 可以用树状数组+二分搞。复杂度O(nlog^2n)。 线段树正解 nlog^2n代码:#include<iostream>#include<cstdio>#include<algor原创 2017-11-07 15:10:15 · 484 阅读 · 0 评论 -
[2017雅礼集训6-28]T2 jump
显然,每个点跳k步能到达的点一定是一个区间。考虑倍增,l[i][k]表示点i跳2^k步能到的左端点,r[i][k]同理。转移: l[i][k]=min{l[j][k-1]} l[i][k-1]<=j<=r[i][k-1] r[i][k]=max{r[j][k-1]} l[i][k-1]<=j<=r[i][k-1] 线段树搞搞。 二分答案求出l[ ],r[ ]后,就是问存不存在l[i]#inc原创 2017-06-30 21:40:47 · 344 阅读 · 0 评论 -
[BZOJ2653]middle 主席树+二分答案
中位数的题目一定要想到二分答案然后把所有数变成1或-1什么的。。。 先离散化,这样最多只有n个值,然后对于每个值建主席树,>=的设为1,<的设为-1。按照升序建的话每次最多更改一个值,也就是logN个点。 设询问区间[ a, b] [ c, d]为然后二分答案K,现在要求的就是在主席树的第K个版本中(b,c)的和,[ a, b]的最大右子段和,[ c, d]的最大左子段和,三个东西加起来是否大原创 2017-04-21 09:05:13 · 377 阅读 · 0 评论 -
[BZOJ2196]Brownie Slicing 二分答案
二维的二分答案。 代码:var r,c,a,b,i,j,li,re,mid:longint; d,s:array[0..510,0..510]of longint;function cal(x1,y1,x2,y2:longint):longint;begin exit(s[x2,y2]-s[x2,y1-1]-s[x1-1,y2]+s[x1-1,y1-1]);end;functi原创 2017-05-01 22:13:54 · 478 阅读 · 0 评论 -
[联合集训6-22] 路灯 整体二分+扫描线树状数组
先给每个点重新设一个坐标(就是把给定的两个边界强行定成横纵坐标找),这个坐标可以直接通过和两个边界叉积得到。 于是点iii的答案就是其左下方所有点答案的第kikik_i小值,如果不足kikik_i个点答案就是iii。 于是我们可以考虑整体二分,二分一个时间MidMidMid,把编号≤Mid≤Mid\le Mid的点强行点亮,看剩下的点中有多少个也能跟着亮。这个二维数点可以横纵坐标分别为一二关键...原创 2018-06-22 22:12:20 · 317 阅读 · 0 评论