二分的各种操作

来源:互联网 发布:养匪自重知乎 编辑:程序博客网 时间:2024/05/17 22:20

二分是一种玄学的算法,为了AC你通常得换N多个模板,就像我当年敲三道二分没模板是一样的,但其实你可以用各种玄学操作来固定模板,你可以用以下模板:

int l=1,r=maxn,mid=(l+r)>>1;//x>>1相当于x/2while (l+1<r){  if (check(mid)) l=mid;  else r=mid;  mid=(l+r)>>1;}
但是有人说,还是会WA啊

那可以在加一些判断啊,比如下面的

if (check(l)) printf("%d",l);else printf("%d",r);//这是你要较小值的情况,如果要较大值就反一下变成if (check(r)) printf("%d",r);else printf("%d",l);
当然我们用的可是C++啊,如果你懒得打模板,你还可以用C++STL库里自带的二分

C++STL库里有两个二分,lower_bound&&upper_bound

lower_bound是找数组里第一个比元素k大的元素下标

upper_bound是找数组里第一个比元素k小的元素下标

注:数组必须是有序的,不然会出错

例如lower_bound(a+1,a+1+n,k)就是找a数组中第一个比k大的数的下标

upper_bound同理。

还有,能用二分的题基本都是直接或间接的给你透露出有序,最大值最小或最小值最大等信息的