二分结构
二分采用以下模板化的代码:
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;
一般用于满足条件的部分在分界点左边的情况。