二分
二分
// 查找第一个满足条件的元素
int l = 1, r = n;
while (l < r) {
int mid = l + ((r - l) >> 1); // 防溢出,等价于 (l + r) / 2
if (check(mid)) {
r = mid; // 满足条件,往左找更小的
} else {
l = mid + 1; // 不满足条件,往右找
}
}
cout << l << endl; // 此时 l == r,是第一个满足条件的值
// 查找最后一个满足条件的元素
int l = 1, r = n;
while (l < r) {
int mid = l + ((r - l + 1) >> 1); // 注意这里要 +1
if (check(mid)) {
l = mid; // 满足条件,往右找更大的
} else {
r = mid - 1; // 不满足条件,往左找
}
}
cout << l << endl; // 此时 l == r,是最后一个满足条件的值

浙公网安备 33010602011771号