整数二分

情况一:左半段满足,右半段不满足 → 求最后一个满足的点

1
2
3
4
5
6
7
8
9
10
bool check(int x);  // 判断 x 是否满足性质

int solve_r(int l, int r) { // 找最后一个满足性质的点
while (l < r) {
int mid = (l + r + 1) >> 1; // 向上取整
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}

情况二:右半段满足,左半段不满足 → 求第一个满足的点

1
2
3
4
5
6
7
8
int solve_l(int l, int r) {  // 找第一个满足性质的点
while (l < r) {
int mid = (l + r) >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}

实数二分

固定精度

1
2
3
4
5
6
7
8
9
10
11
12
const double eps = 1e-8;

bool check(double x);

double solve(double l, double r) {
while (r - l > eps) {
double mid = (l + r) / 2;
if (check(mid)) l = mid;
else r = mid;
}
return l;
}

固定迭代次数

1
2
3
4
5
6
7
8
double solve(double l, double r) {
for (int i = 0; i < 50; i++) {
double mid = (l + r) / 2;
if (check(mid)) l = mid;
else r = mid;
}
return l;
}

二分查找(STL)

头文件:<algorithm>

  • lower_bound(begin, end, val):返回第一个 >= val 的迭代器
  • upper_bound(begin, end, val):返回第一个 > val 的迭代器

本站由 zaochen 使用 Stellar 1.33.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
全站访问量 - 次 · 访客数 - 人 · 本页面浏览 -