二分模板
作者:
ccyyw
,
2021-09-05 15:36:00
,
所有人可见
,
阅读 240
整数二分
模板1:找右边界,满足条件的最后一个数
`// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_right(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid; // check()判断mid是否满足性质
else r = mid - 1;
}
return l; //跳出循环时,l和r相等
}`
模板2:找左边界,满足条件的第一个数
`// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_left(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}`
浮点数二分
`double bsearch_double(double l, double r)
{
double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求
while (r - l > eps)
{
double mid = (l + r) / 2;
if (check(mid)) r = mid;
else l = mid;
}
return l;
}`