整数域二分
在递增序列 \(a\) 中查找 \(\geq x\) 数中最小的一个(即 \(x\) 或 \(x\) 的后继)
int l = 0, r = 1E8, ans = r;
while (l <= r) {int mid = (l + r) / 2;if (judge(mid)) {r = mid - 1;ans = mid;} else {l = mid + 1;}
}
return ans;
在递增序列 \(a\) 中查找 \(\leq x\) 数中最大的一个(即 \(x\) 或 \(x\) 的前驱)
int l = 0, r = 1E8, ans = l;
while (l <= r) {int mid = (l + r) / 2;if (judge(mid)) {l = mid + 1;ans = mid;} else {r = mid - 1;}
}
return ans;
实数域二分
目前主流的写法是限制二分次数。
for (int t = 1; t <= 100; t++) {ld mid = (l + r) / 2;if (judge(mid)) r = mid;else l = mid;
}
cout << l << endl;
