二分答案是一个很神奇的东西,如果答案可以线性判断,那么就可以考虑二分
二分可以将一个时间复杂度为O(n)的简化为O(logn)
——————————————————————————————————————————————
使用二分,首先要满足答案是单调的,其次判断二分出的答案是否满足条件的判断要足够简单
——————————————————————————————————————————————
模板:
while(l<r){
int mid=(l+r)>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
while(l<r){
int mid=(l+r+1)>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
整数的二分:
//l初始值为答案的最小值,r初始值为答案的最大值
while(l<=r){
if(check(mid)) r=mid-1;
else l=mid+1;
}