二分的三种实现形式:
1.最普通的:
while(l<=r){
int mid=l+r>>1;
if(check(mid)){
ans=mid;
r=mid-1;
}else l=mid+1;
}
2.当二分出来的值必须是某个集合中的值:
把可能出现的值放到数组中,sort一下,再去二分
3.二分实数:
while(r-l>eps){
double mid=(l+r)/2;
if(check(mid)){
r=mid;
}else l=mid;
}
cout<<r<<'\n';
二分做法的一般步骤:
一、识别出二分做法:
1.最小值最大 or 最大值最小
2.凭空出现一个未知值,枚举一定超时,且满足单调性
3.求最值
二、看二分的值是否满足单调性
1.将二分出来的值趋于正无穷,看是否满足条件
2.将二分出来的值趋于0,看是否满足条件
3.如果一边是0,一边是1,说明满足单调性
三、check(最重要的一步):
分为两类:
1.在check里面贪心(占绝大多数):考虑贡献,然后去贪心地满足题干中要求的其它条件
2.在check里面做DP(少数):按DP做法即可
注意:在check函数里的条件一定要满足单调性,且答案一定是最后一个满足check里面条件的值