
二分相关
wanherun
今天会有好事发生吗
展开
-
bzoj3969 [WF2013]Low Power
题目看见最大值最小,明显可以看出这是一道二分答案的题。如何判断呢。首先,我们先对原数组排序,这样每次的差最小一定会在两个相邻的数之间。所以排好序之后,判断的时候,只要从前往后扫,只要相邻两个数的差小于二分的答案x,就把它们放入一个电池,然后把剩下的电池依次放入,判断每个时刻是否可行就好了。#include<bits/stdc++.h>#define N 1000005using namespac原创 2018-01-22 07:53:00 · 408 阅读 · 0 评论 -
bzoj2654 tree
题目也是比较神奇的一道题,我们先把白边都加一个权值,这样的话,每次最小生成树中白边都会减少,而且,这样肯定满足二分性质的。不过,有一点需要注意的1是,排序是,如果权值相同,白边要排在前面。#include<bits/stdc++.h>#define N 100000using namespace std;struct line{ int x; int y; int va原创 2017-09-06 21:53:33 · 296 阅读 · 0 评论 -
bzoj4326 NOIP2015 运输计划
题目遥想当年初三参加时,想到了二分,想到了lca,就没想到如何判断,然后差20分省一23333.首先答案显然满足二分性质,之后判定答案。我们把长度超过k的路径找到,找出它们公共边中最长的,把它变为0,看是否可行。 如何,找公共边?树链剖分当然可以,但太复杂了。可以把两端标记加1,lca标记减2,之后以一个节点为根的子树的和,即为这条边经过了几次。#include<bits/stdc++.h>#d原创 2017-09-11 21:52:15 · 237 阅读 · 0 评论 -
bzoj2013 [Ceoi2010]A huge tower
题目神题呀,考虑从小往大加入,设目前最长的为x,给它放入,显然,比它小的一定可以放在上面,现在看它的下面可以放什么,显然是一段连续的区间,我们可以二分一下l。但是,又发现,它肯定是单增的,所以用一个变量加一下就好了。#include<bits/stdc++.h>#define N 620000#define mod 1000000009using namespace std;int n,d,原创 2017-10-12 22:50:47 · 302 阅读 · 0 评论 -
bzoj1510 [POI2006]Kra-The Disks
题目我们显然发现,一个通道后边比它大的是没有意义的,所以我们把它全变为一样的。如 5 6 4 3 6 2 3 变成 5 5 4 3 3 2 2,就好了,这样就具有单调性,就可以二分解决了。#include<bits/stdc++.h>#define N 300000using namespace std;int n,m,tmp,mx;int A[N+5],x,l,r,mid;inline原创 2017-10-14 23:08:08 · 251 阅读 · 0 评论 -
bzoj4747 [Usaco2016 Dec]Counting Haybales
题目又是二分题,熟用lower_bound与upper_bound就好了,其实也可以离散化然后前缀和的。#include<bits/stdc++.h>#define N 100000using namespace std;int n,m;int A[N+5];int x,y,l,r;inline char nc(){ static char buf[100000],*p1=bu原创 2017-10-14 23:10:11 · 437 阅读 · 0 评论 -
[noip2015]跳石头 题解
求最小的最大,一般就都是二分答案的题。首先,这是显然单调递增的,我们二分这个最大长度len,看能否满足条件。具体操作也很简单,看两块石头之间是否大于了len,如果大了,就移除第二个,继续比较。 最后看一看移除的数量和m的关系就好了。#include<bits/stdc++.h>#define N 50000using namespace std;int n,m,L,l,r,mid,mx;i原创 2017-10-22 17:30:49 · 872 阅读 · 0 评论 -
[noip2015]运输计划 题解
貌似又是最大最小问题,考虑二分答案。好了,现在我们已经二分出答案(len)了,如何判断是否合法。其实思路十分简单,就是把所有长度大于len的路径记录,然后找它们交的最大值,减去,看是否满足答案。问题就变成了如何求路径的交,树链剖分是可以的,但还有更优的做法。树上差分,把路径起点加一,终点加一,lca减二,一个点的子树权值和就是该点到父亲的边上的经过次数了。#include<bits/stdc++.h原创 2017-10-22 17:52:17 · 434 阅读 · 0 评论 -
[noip2012]借教室 题解
emm,根据题意描述,就是每次区间加一个数,问是否满足条件。首先,答案肯定满足二分性质,之后就是判断了。说白了就是很多次区间加,然后一次查询前面各个数。当然,线段树,树状数组裸题,但是,这样是nlogn的,过不了呀。要重新考虑。由于只查询一次,我们可以差分数组,每次修改是O(1)的,查询是O(n)的,综合一下,也是O(n)的,就好了,具体做法是在cnt[s]+=add,cnt[t+1]-=add,前原创 2017-10-29 21:35:35 · 537 阅读 · 0 评论 -
bzoj1614 [Usaco2007 Jan]Telephone Lines架设电话线
题目又是最小最大值问题,这显然是满足二分性质的。二分最大值,把权值比它小的边新权值设为0,比它大的设为1。然后再跑一遍最短路,比较到n的距离与k的大小就好了。#include<bits/stdc++.h>#define N 20000using namespace std;int n,p,k,l,r,mid,mn,x,y,z;int first[N+5],nxt[N+5],to[N+5],v原创 2017-11-09 14:24:40 · 277 阅读 · 0 评论 -
bzoj5090 组题
题目好久好久没有更新博客了,现在开始要好好学了。分数规划第一题吧,第一次听说这个东西是在冬令营,现在算是做过一道题了吧。二分最后的答案,之后把原数组每个数都减去这个答案,如果这个解成立的话,必须有一段区间和为正数,这样的话,我们把它转化为前缀和,只要找一个sum[j]>=sum[i]sum[j]>=sum[i]就好了。但是,这道题有一个问题,就是答案要求是分数,这样我们只能求出一个小数。我们就要在判原创 2018-01-15 20:11:53 · 370 阅读 · 0 评论 -
hdu6031 Innumerable Ancestors
题目答案明显满足二分性质,所以我们可以先二分出答案的深度,然后判断的话,把A集合用倍增跳到那个深度,再对B集合做同样的操作,判断两个祖先集合的交是否为空集,只要用map就可以呢。还有另外一个解法,就是深度最大的LCA在DFS序中与它们两点距离最近,然后贪一贪就好了。#include<bits/stdc++.h>#define N 500000using namespace std;int n,原创 2018-01-17 22:27:45 · 424 阅读 · 1 评论 -
bzoj4653 [Noi2016]区间
noi原题,不好评价。题目显然,我们选区间内的点不如就选区间端点,那就想到了离散化。由于要最大减最小,我们枚举最小的区间,依次加大区间,看加到何时该段成立,这就是线段树的操作了。注意枚举大区间时直接从上次开始就好了,稍微一想可得是单增。。。#include<bits/stdc++.h>#define N 600000using namespace std;struct Tree{ in原创 2017-08-28 21:10:39 · 254 阅读 · 0 评论