关于二分写法

灌水区

ningago @ 2022-06-20 23:11:27

寄,连二分都调不对了

while(l < r)/while(l <= r)
{
    mid = l + r >> 1;
    if(check(mid)
    {
        l = mid + 1;/l = mid;
        ans = mid;
    }
    else
        r = mid - 1;
}

被死循环坑傻了,求问两个/左右的什么时候该选择哪个?


by Ginger_he @ 2022-06-20 23:13:43

我习惯写上面第二个,下面第一个


by xyf007 @ 2022-06-20 23:14:57

第一个右边,第二个左边,任何时候都是对的


by ningago @ 2022-06-20 23:15:23

@Ginger_he 之前有人跟我说只是写法问题,但我调的时候发现好像有点规矩?


by ningago @ 2022-06-20 23:15:49

@xyf007 您是指两个同时用?


by YGB_XU @ 2022-06-20 23:16:55

上二下一就对的吧


by Ginger_he @ 2022-06-20 23:17:10

@ningago (有题目吗


by ningago @ 2022-06-20 23:18:43

@Ginger_he 题目是二分求前驱(当然不是个裸题)

您楼下好像说的是对的


by ningago @ 2022-06-20 23:18:59

哦哦,您也说的是对的


by ningago @ 2022-06-20 23:20:05

@YGB_XU @Ginger_he @xyf007 万分感谢


by Element_e @ 2022-06-20 23:21:35

本人用的模板

bool check(int x){/* ... */} 

// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l, int r)
{
    while(l < r)
    {
        int mid = l + r >> 1;
        if (check(mid)) r = mid;    // check() 判断 mid 是否满足性质
        else l = mid + 1;
    }
    return l;
}

// 区间[l, r]被划分成[l, mid - 1]和[mid, r] 时使用:
int bsearch_2(int l, int r)
{
    while(l < r)
    {
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    return l;
}

| 下一页