1.确定一个区间,使得目标值一定在区间中
2.找一个性质,满足:
(1)性质具有二段性
(2)答案是二段性的分界点
整数二分:
第一类:ans是红色区间的右端点
将[L,R]分成[L,M-1]和[M,R]
if M是红色的,说明ans仍在[M,R]
else ans仍在[L,M-1]
while(L < R)
{
M = (L + R + 1) / 2; //上取整
if (M == red) L = M;
else R = M - 1;
}
第二类:ans是绿色区间的左端点
将[L,R]分成[L, M] 和 [M + 1, R]
if M是绿色的,说明ans仍在[L, M]
else ans仍在[M + 1, R]
while(L < R)
{
M = (L + M) / 2;
if (M = green) R = M;
else L = M + 1;
}
如果更新方式写的是R = Mid,则不用做任何处理;如果更新写的是L=Mid,则需要在计算Mid时加上1.
早晚薄纱