二分 + 三分模板

参考资料

  1. 将区间 \([l,\ r]\) 划分为 \([l,\ mid]\)\([mid + 1,\ r]\)
    代码:
int bsearch_1(int l, int r){
    while (l < r){
        int mid = l + r >> 1;
        if (chk(mid)) r = mid;
        else l = mid + 1;
    }
    return l;
}
  1. 将区间 \([l,\ r]\) 划分为 \([l,\ mid - 1]\)\([mid,\ r]\)
    代码:
int bsearch_2(int l, int r){
    while (l < r){
        int mid = l + r + 1 >> 1; // 防止死循环
        if (chk(mid)) l = mid;
        else r = mid - 1;
    }
    return l;
}
  1. 浮点数的二分
    代码:
double bsearch_3(double l, double r){
    while(r - l > eps){  // eps 根据题意给的精度要求而定
        double mid = l + r >> 1;
        if(chk(mid)) l = mid; // 具体根据题意判断
        else r = mid;
    } 
    return l;
}
  1. 三分
    代码:
int bsearch_4(int l, int r){
    while(l + 1 < r){
        int lm = l  + r >> 1;
        int rm = lm + r >> 1;
        if(chk(lm) <= chk(rm)) r = rm; // 看题意而改符合
        else l = lm;
    }
    return l;
}
posted @ 2020-06-01 18:01  nonameless  阅读(89)  评论(0编辑  收藏  举报