![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
二分
EMber _
人但有追求,世界亦会让路。
展开
-
bzoj2144 跳跳棋 二分+lca
这道题刚开始看以为是DP,,,我真是智障了。该DP的看成搜索,该二分的看成DP。。这状态有点危险。。 题意:现在有三个人a,b,c,每一个人可以跳过他左/右边的人,比如说一个人在x,一个在y,那么x可以跳到y+(y-x)(y>x),左边同理。。但是两个人之间不能有另一个人。 现在有三个目标位置和起始位置,让你计算最少的步数让三个人到达目标位置,并不要求人的顺序(即无论哪一个人都可以去任意的终点)原创 2016-08-15 21:17:02 · 708 阅读 · 1 评论 -
poj 2723 Get Luffy Out 二分+2-SAT
题目大意:有n对钥匙,每一对拿了一个另外一个就会消失,有m扇门,每一扇门有两个锁,分别对应2*n把钥匙,求按顺序最多可开多少门。 比较明显的模型呢,先把对立边记录下,然后直接二分用2-sat判断,毕竟2-sat不能直接求出答案只能判断是否可行。 二分的时候连前mid扇门就好啦。#include<cstdio>#include<cstring>#include<algorithm>#incl原创 2017-06-23 22:04:02 · 759 阅读 · 0 评论 -
bzoj2406 矩阵 二分+有源汇上下界网络流
题意略。%%ymw大神,考场上直接切。 先二分答案。 然后连边,先预处理一下横行纵行的前缀和,然后b的每行每列取值范围就是r[i]-mid,r[i]+mid,列同理。 那么我们把横行和纵行看做点,拆成两部分形成一个二分图,横行纵行之间连边,容量为(r[i]-mid,r[i]+mid),列同理。 然后跑可行流来判断。 如果要求输出答案的话提前记录一下就好了。#include<cstdio>原创 2017-07-15 20:39:10 · 232 阅读 · 0 评论 -
bzoj4726 [POI2017]Sabota 二分+暴力
直接二分,判断的话太显然了吧。。 不知道为什么那么少人A。#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;原创 2017-07-16 20:44:59 · 343 阅读 · 0 评论 -
bzoj2756[SCOI2012]奇怪的游戏 二分 分类讨论 最大流
细节比较多的一道题目。 题意:给你一个矩阵,每次能把相邻的两个数都+1,问你最少多少次能把整个矩阵的数都变成同一个数。 网络流的模型比较明显,但是正解的话考场上可能不容易想到= =。 先把整个网格图黑白染色,设格子数和总和分别为num1,sum1,num2,sum2. 那么假设最终变成了X,那么最后的答案肯定是X*num1-sum1,即添加了多少次。 然后我们分类讨论。 num1!=nu原创 2017-07-30 20:50:38 · 229 阅读 · 0 评论 -
bzoj4724 [POI2017]Podzielno 数论
题意比较明显就不说了。 这题并不用什么算法,,只是探究性质。 可以证明,一个数能被B-1整除,那么他在b进制下的每一位的和加起来刚好能被B-1整除。 证明: 当这个数的某一位+1时,进位,那么这一位减去B-1,下一位+1 当这个数的某一位-1时,退位,那么这一位加上B-1,下一位-1. 于是当一个数加上B-1时,他在B进制下模B-1意义下是不变的。那么对于这个题目,我要最大,所以取最多的原创 2017-07-19 16:51:56 · 247 阅读 · 0 评论 -
bzoj1510[POI2006]Kra-The Disks 二分
二分一下就好了。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int N=3e5+5;原创 2017-08-20 17:00:17 · 316 阅读 · 0 评论 -
bzoj1816[Cqoi2010]扑克牌 二分答案+构造
题意:你有n种扑克牌,每个有a[i]张,还有m张万能牌,定义一组牌,有n张不同的牌,问最多能有多少组。一眼二分答案。 看看每种牌数量离二分的答案差多少,然后直接用万能牌贪心的填就好了,直接用m-(x-a[i])不用担心会重复,因为减剩下的,你可以把他分配到不同的组里面去。 可能这样讲还是不很容易明白,建议自己手推一下,可以通过调整把减去的和未减去的不在同一组内(如果可行)。代码挺简单的,bzoj原创 2017-09-13 12:52:07 · 422 阅读 · 0 评论 -
bzoj1863 [Zjoi2006]trouble 皇帝的烦恼 二分+DP
题意:给定一个数列a,第i个人要a[i]个勋章,相邻两个不能有相同的勋章。问最少需要多少个勋章。二分,问题是怎么判断。 设一个mn,mx表示第i个人和第一个人最多/少有多少个勋章和第一个人相同,那么在保证和前一个的没有相同的情况下往后推,那么看第n个人的mn是否==0就可以了。问题是怎么推。。 mx[i]=min(a[i],a[1]−mn[i−1]);mx[i]=min(a[i],a[1]-mn原创 2017-09-08 22:05:01 · 251 阅读 · 0 评论 -
bzoj1196 [HNOI2006]公路修建问题 二分
题意:看链接吧,懒得写了,很好懂。 十分简单的二分,判断跟mst差不多。#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;const in原创 2017-10-02 16:17:52 · 249 阅读 · 0 评论 -
bzoj2709 [Violet 1]迷宫花园 二分+spfa
题意:一个矩阵,起点终点固定,有障碍,横向相邻两格的时间固定为1,要求纵向的时间,然后给定L,要求从起点到终点在<=L的情况下尽量大。 这煞笔二分题啊,还不卡精度简直良心啊,然后我因为没写head[x]=tot而调了半个小时。。???没脸见人了┴─┴︵╰(‵□′╰)。#include<cstdio>#include<cstring>#include<iostream>#include<alg原创 2017-10-20 21:40:51 · 255 阅读 · 0 评论 -
bzoj1567[JSOI2008]Blue Mary的战役地图 二分+矩阵hash
题意:给出两个矩阵,求最大重合。 做出两个矩阵的hash以后二分最大正方形的边长,基础hash。 模数不好设,用自然溢出就好。#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)u原创 2017-11-03 20:31:34 · 226 阅读 · 0 评论 -
bzoj4698Sdoi2008 Sandy的卡片 后缀数组+二分
其实不是很难的一道题,但是被坑了很久= =。。。 首先他没有给出字符集所以我们要自己算出来。 然后,离散一下,这里的离散是把所有的数字变成他们之间的差(这个很显然但是不好想,可能是我有点sb想了半天才想到) 然后SA求出height以后二分判断的时候扫一遍看看连续LCP>=mid的是否有n个就可以了。#include<cstdio>#include<algorithm>#include<c原创 2017-06-07 14:24:47 · 269 阅读 · 0 评论 -
bzoj1728[Usaco2006 Open]Two-Headed Cows 双头牛 二分+染色
题意挺显然的就不说了。 这题我= =丢脸丢大了。。一开始我觉得这题双头牛的模型有点像网络流,想了想反手给自己一耳光。。 然后觉得二分可做?但是怎么判断啊? dp不可做啊,这个条件要用上的话时间会炸。 然后就蒙蔽了,想了半天没啥想法。 然后看到题解:二分+染色 第一反应:不可能啊怎么可能二分,我随手给你个反例: 4 6 1 B 3 A 1 A 3 A 2 B 3 A 2 A 3原创 2017-06-17 16:28:13 · 478 阅读 · 0 评论 -
bzoj1720[Usaco2006 Jan]Corral the Cows 奶牛围栏
题意:给n个点,问要搞一个正方形包括进c个点,边长最小。 论不好好看题的危害,水题搞半天。 一开始以为是长方形,感觉二分不可做?(傻逼的我,二分套二分不就好了) 然后我就觉得直接暴力就好。 接下来这一段是我傻逼的错误题目思考过程,不想看的可以跳过易证(长)方形边上一定有点。然后每个点枚举四个方向,四个方向上存下所有点,然后排个序求个第c小就好了。其实这种算法貌似没有什么问题,其实问题大了原创 2017-06-17 10:42:05 · 879 阅读 · 0 评论 -
51nod 1105 第K大的数
题意就不说了。。我真是菜哭了,四级都不能随手切,,感觉NOIP药丸。。。 一眼二分,但是怎么判断一直没有想到、、后来看了别人的题解才知道tmd原来是log方的,亏我一直在想log的,,,其实看看数据范围就知道是可以log方。。。判断就是直接判断,,,先把a和b排序,然后确定当前二分的数所在的范围(即是由a中的哪个数组成的),然后再二分b中匹配的位置,然后每次用n减去,就是小于当前二分数的数字的数量原创 2016-11-07 21:09:57 · 379 阅读 · 0 评论 -
NOIP提高A组集训第10场11.8 力场护盾
DescriptionZMiG成功粉碎了707的基因突变计划,为了人类的安全,他决定向707的科学实验室发起进攻!707并没有想到有人敢攻击她的实验室,一时间不知所措,决定牺牲电力来换取自己实验室的平安。 在实验室周围瞬间产生了一个无限大的力场护盾,它看上去无懈可击!不过ZMiG拥有惊人的双向观察能力,经过他的反复观察,找到了这个护盾的N个弱点,他本想逐一击破,却发现一股神秘力量阻止了他的原创 2016-11-08 20:49:30 · 391 阅读 · 0 评论 -
51nod 算法马拉松19 A P1674
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1674 比赛的时候耗尽千辛万苦才切出来。。我觉得要切出这道题,肯定要对位运算的性质有些了解。。 因为是and或者or,我们发现,无论是哪个,变化情况种数最多不超过30种,所以总共不超过60种。这也就代表着,在区间里肯定有一些区间内的答案是一样的,我们对于这样的区原创 2016-10-31 15:57:53 · 326 阅读 · 0 评论 -
51nod 1257 背包问题V3
这题目比较简单了,直接二分价值做,比较无脑,但是c++的比较好像有点问题,我直接比较才行,如果是带个变量进去就会炸,莫名其妙。#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i原创 2017-02-18 10:42:47 · 296 阅读 · 0 评论 -
bzoj1639
直接二分判断就好了。。裸题。。一开始把每个组的和初始化成给的mid了。。#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;typedef l原创 2017-03-08 21:44:27 · 198 阅读 · 0 评论 -
bzoj1614
分析:因为求路径的最大值最小,那么二分答案,只要边权小于二分值得都可以为0,否则为1,因为如果边权小的话,对于答案很明显没有影响,,大于的话用免费去点就行了。。一开始还以为是分层图。。果然我还是太naive了。#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstrin原创 2017-03-05 22:02:17 · 239 阅读 · 0 评论 -
bzoj4101[Usaco2015 Open]Trapped in the Haybales
分析:这题目难得一见的好题。。我怎么感觉到了#2题目都变难了一些。。 一开始硬是没搞清楚样例怎么算的。。然后突然看见题目中:贝西可以走到干草堆上。????woc蜜汁能走上去不能走过去? 。。然后才懂。。他的意思是贝西可以走到一个干草堆上然后向另外一个干草堆冲刺。。(有毒) 那么可以列个式子:假设只增加左边干草堆的大小,增加d,左边干草堆编号为i,右边为j 那么可以列式子:size[i]+d>原创 2017-03-11 21:48:56 · 497 阅读 · 0 评论 -
bzoj4525
分析:一眼二分,但是判断答案不知道怎么贪心,然后想了想,发现直接从左到右做就可以了,这样肯定是最优的。注意一下二分的边界。#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd原创 2017-03-31 09:35:37 · 305 阅读 · 0 评论 -
bzoj3432
分析:一眼题,直接二分,然后用bfs判断,然而sb的我一开始以为要把每两个点之间都跑一遍。。结果走到宿舍的路上突然发现会超时。。然后想了想根本不用任意两个点之间遍历一遍,直接全图扫一遍,看看1的数量是不是等于原图就行了。。#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#define fo(i,a,b原创 2017-03-14 21:29:01 · 306 阅读 · 0 评论 -
bzoj2440 [中山市选2011]完全平方数 反演容斥+二分
题意:求第k个非完全平方数。 二分一下前mid中有多少个非完全平方数,判断用容斥做,通过反演得答案就是n-奇数个质数的平方的倍数的个数+偶数个质数的平方的倍数的个数 那么ans=Σμ[i]*(n/i^2) (i<=sqrt(n))#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<ios原创 2017-04-12 22:22:28 · 249 阅读 · 0 评论 -
bzoj1733[Usaco2005 feb]Secret Milking Machine 神秘的挤奶机
明显二分答案。 然后对于这种求路径数量的一般都用网络流= = 每次二分出一个x,边小于等于x的才连,然后容量都为1,s到1和n到t连容量为要求路径总数的边,由于是双向边所以要连两次= =。#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd原创 2017-06-05 11:07:39 · 357 阅读 · 0 评论 -
bzoj2097[Usaco2010 Dec]Exercise 奶牛健美操
题意:将一棵树划分为S+1块,使得每块的直径最小。 明显二分。 每次找出子树内的最长链和次长链,相加超过当前二分答案就删掉最长。 dp一下即可。 注意不能直接暴力判断(即走x步标记一下),这种方法并不是最优。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define fo(i,a,b) f原创 2017-05-20 08:53:50 · 363 阅读 · 0 评论 -
bzoj2258: pku2758 Checking the Text 文本校对 hash+二分
题意:给你一段文本 要求比对从文本中某两个位置开始能匹配的最大长度是多少。可以插入字符。 一开始不看范围感觉这题巨难,死刚SAM搞不出来,然后看看范围感觉自己被逗了。。 hash+二分,记录一下字符位置就好了,由于插入很少暴力更新hash数组即可。 自然溢出。 #include<cstdio>#include<algorithm>#include<cstring>#define fo(i原创 2017-11-05 21:52:41 · 286 阅读 · 0 评论