二分答案 O(nlogm)
对一段有序的序列 每次二分,从而快速的查找。解决的问题常是“使最大值最小”或“使最小值最大”。
注意:①注意二分的序列是有序的,对于无序的序列进行二分需要先排序。
②二分的区间尽可能大(给定区间左右端点+-1)
③根据题目要求,设定好check函数。
④防止死循环。↓
模板:
1 //第一种 2 while(r-1>l) 3 { 4 int mid=(l+r)>>1; 5 if(check(mid)) l=mid; 6 else r=mid; 7 } 8 printf("%d",l); 9 //第二种 10 //① 11 while(l<r) 12 { 13 int mid=(l+r)>>1; 14 if(check(mid)) l=mid+1; 15 else r=mid; 16 } 17 printf("%d",l-1); 18 //② 19 while(l<r) 20 { 21 int mid=(l+r)>>1; 22 if(check(mid)) l=mid; 23 else r=mid-1; 24 } 25 printf("%d",r);
例题:
【NOIP2015】【luogu2678】跳石头 →简单的二分,注意特判
【codevs2072】分配房间 →简单的二分,和跳石头很像,注意check函数的设定
【NOIP2016】【luogu1083】借教室 →较难,二分+差分