//二分答案是最容易写挂的
1.while(l<r) 一定是< 且在l==r时退出循环
2.如下pd(mid)的mid可以作为答案时,l=mid或r=mid
不能作为答案干脆在+1/-1,因为r/l已经不可能是答案了
3.如果答案要求尽量小,为第一种,尽量大,为第二种
//单调递增序列a中查找>=x的数中最小的一个(即x或x的后继)
while(l<r)
{
int mid=(l+r)/2;
if(a[mid]>=x) //if(pd(mid)>=x)(二分答案时)
r=mid;
else
l=mid-1;
}
return a[l];
//单调递增序列a中查找<=x的数中最大的一个(即x或x的前驱)
while(l<r)
{
int mid=(l+r+1)/2; //如果是(l+r)/2 可能l=4,r=5,mid=4,下一轮依然不变
if(a[mid]<=x) //if(pd(mid)<=x)(二分答案时)
l=mid;
else
r=mid+1;
}
return a[l];
//实数域上的二分
while(l+1e-5<r)
{
double mid=(l+r)/2;
if(calc(mid))
r=mid;
else
l=mid;
}
//实数:二分100次
for(int i=0;i<100;i++)
{
double mid=(l+r)/2;
if(calc(mid))
r=mid;
else
l=mid;
}