二分结构

二分采用以下模板化的代码:

int l = ..., r = ...;
while(l < r) {
	int mid = l + r >> 1;
    int cur_ans = calc(mid);
    if(checked(cur_ans)) r = mid;
    else l = mid + 1;
}
ans = l;

最后得到的答案满足checked(calc(ans))&&!checked(calc(ans+1))。

注意,该结构不能修改。能修改的是calc()和checked()。如果限制条件要求方向相反,就将限制条件反转一下。

20180928Upd:也可采用另一种模板:

int l = ..., r = ...;
while(l < r) {
	int mid = l + r >> 1;
    int cur_ans = calc(mid);
    if(checked(cur_ans)) l = mid + 1;
    else r = mid;
}
ans = l - 1;

一般用于满足条件的部分在分界点左边的情况。

posted @ 2018-09-27 16:56  Utoрia  阅读(178)  评论(0编辑  收藏  举报