本蒟蒻的二分每次都要写炸……整理一下二分的写法,这次我可得记住了。
(摘自《算法竞赛进阶指南》)
//整数集合上的二分
//在单调递增序列a中查找≥x的数中最小的一个(即x或x的后继):
while(l<r)
{
int mid=(l+r)>>1;
if(a[mid]>=x)r=mid;else l=mid+1;
}
return a[l];
//在单调递增序列a中查找≤x的数中最大的一个(即x或x的前驱):
while(l<r)
{
int mid=(l+r+1)>>1;
if(a[mid]<=x)l=mid;else r=mid-1;
}
return a[l];
//实数域上的二分
//一般保留k位小数时取精度eps=10^(-k-2)
while(l+1e-5<r)
{
double mid=(l+r)/2;
if(calc(mid))r=mid;else l=mid;
}
//循环固定次数的二分
for(int i=0;i<100;i++)
{
double mid=(l+r)/2;
if(calc(mid))r=mid;else l=mid;
}