Loading

「学习笔记」分治

二分

常见的二分一般有两种:二分查找和二分答案
二分查找一般是在一个有序数组内使用二分查找元素,当然也可以直接用 STL 中的 lower_boundupper_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;
	}
}
posted @ 2023-02-26 21:33  yi_fan0305  阅读(35)  评论(0编辑  收藏  举报