「学习笔记」分治
二分
常见的二分一般有两种:二分查找和二分答案
二分查找一般是在一个有序数组内使用二分查找元素,当然也可以直接用 STL
中的 lower_bound
和 upper_bound
来做。有一些数据结构可以较快的二分查找,比如线段树、平衡树。
二分答案是指对于一道题,它的答案具有某种单调性,在直接求答案不好求的时候,我们可以对答案进行二分,变为判定性问题。
一般模板
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) {
ans = mid;
l = mid + 1;
}
else {
r = mid - 1;
}
}
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) {
ans = mid;
r = mid - 1;
}
else {
l = mid + 1;
}
}
三分
如果需要求出单峰函数的极值点,通常使用二分法衍生出的三分法求单峰函数的极值点。
下面是一种写法
db l = 0, r = 1000.0, ans = 0;
while (r - l >= eps) {
db len = (r - l) / 3;
db fl = f(l + len), fr = f(r - len);
if (fl > fr) {
l = l + len;
ans = l;
} else {
r = r - len;
ans = r;
}
}
朝气蓬勃 后生可畏