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;
}