二分答案杂题
二分答案杂题
二分答案适用于答案具有单调性/包含性的题,一般时间复杂度为\(O(nlogn)\),最重要的是找准二分答案的对象,以及check的优化(包括但不限于差分、前缀和、单调队列)。
目前正确性可以保证并且可以覆盖到整个区间不出现死循环的二分只有两种:
1.\(mid=(l+r)/2\),\(l=mid+1\),\(r=mid\);
2.\(mid=(l+r+1)/2\),\(l=mid\),\(r=mid-1\);
两个的退出条件都是\(while(l<r)\)。
小数二分最好宏定义一个\(eps\)精度,一般以题目要求的精度小10-100倍
P1024 :一眼题,略
P1678:排个序,二分查找,比较刚好比自己大一点的那个大学与刚好比自己小一点的大学做差比较绝对值,累加。
P1258:我更宁愿相信这是一道小学奥数题。(画图手推咯)
P1824:先排序,二分最近距离。一旦距离大于check的x,那么牛的数量++,最后比较牛的总数与当前距离满足要求可以住下的牛的总数。
P2249:二分查找,lower_bound与upper_bound的应用。
P1163:小数二分板子题,二分每个月的月利息,然后纯模拟。
P2390:建议使用贪心,还好想一点。
P2920:先以时间先后顺序排序,二分最早开始的时间,需要特判一下check(0)==0时应该输出-1,他无论怎样都做不完。
P4058:二分时间,注意木料必须是一整棵树。
P2678&P1182&P2855&P3853:四倍经验,二分最小的最大距离,每一次check扫一遍,距离大于check(x)的x,就记录一下,最后判断按照这个距离需要分几段,与题目要求进行比较。(其中前两道原题,后两道变了一点)
P1638:可以采用莫队的思想(其实就是一个小trick,读者自己想一下),可以保证check的时间复杂度为O(n),同时最后输出的时候也有一个小技巧,给check函数里增加一个变量opt,判断当前函数的目的是二分答案还是最后的输出答案,具体见代码。
P2005:恶心人的一道题,需要使用高精度。
P2440&P1577:双倍经验,只不过一道是整数,还有一道是小数二分,二分长度len。
P1570:小贪心,每一次check需要排序,时间复杂度O(nlog2n)
P1873:二分高度,时间复杂度\(O(nlogn)\)。
P1843:模拟,二分最少用的天数,在一定天数内由自然晒干的continue,对于每一个干不了的使用机器(注意机器只能以整数天使用,你每天可以烘干5点的机器去干一件一点的衣服也需要一天),所以除的时候向上取整,最后判断天数是否可以接受。
P1883:就一板子题。
P1661:建议会用并查集维护的用并查集。
P3743:小数二分,类似P1843一样处理,电用完了就找充电宝,这里的充电宝支持小数时间的充电。
P1083:前缀和优化check,前缀和里也讲了的,二分时间。
P2985:二分最不开心的一天的开心值,模拟,输出时如果还有糖果没有吃完那么默认没吃完的糖果留在最后一天吃。
P8666:之前说了的多维差分板子题,也可以用二分(有点麻烦)。
P1281:计算总页数,二分答案(思路类似前面的四倍经验),计算出最多的人需要的最短的时间,然后以这个最短的时间为标准再扫一遍,处理出每一个人需要的做的页数,排序,保证最前面的人做的活最少。
P3611:二分答案裸题,啥都告诉你了,模拟的时候可能需要用到大根堆,留在这自己思考哒。
P9588:还是那一到乱搞题,用STL水过去。
P2804:注意到平均值大于给定的常数m,那么如果我们将每一个\(a[i]-=m\),那么满足条件的一段序列就是和大于0,前缀和预处理后,设左端点l,右端点r,那么\(sum[r]-sum[l-1]>0\),也就成了求逆序对的板子题,不知道和二分有啥关系,逆序对可以用树状数组和归并排序维护。
P1314:直接模拟,二分出参数W,再把W带入求得\(|s-y|_{minn}\),check里前缀和优化,时间复杂度\(O(nlogn)\)
P1542:直接模拟,小数二分,注意快递员是只能在\(l_1\)到\(r_1\)之间送货。
P4734:喵喵喵,自己做。
P4447:贪心+二分查找,几乎和二分答案没有关系(那我是咋放进来的)。
P3957:数据水,可以放心地写\(O(n^2logn)\)的DP假做法练二分答案。
P1663:好耶,初中数学题,计算出\(n-1\)条斜线的解析式,然后小数二分,二分最低的y值,对于每一个解析式,带入y解出不等式,根据\(a[i]\)的正负可以得出解得区间方向,用两个全局变量l,r算出每一个不等式得交际,最后判断是否有解,有解则说明当前的y值是可以接受的。最后输出就可以了。
P3933:四个方向每个方向都要一次二分答案,思考题。
相关题单:戳我