【笔记】二分答案

二分答案 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】借教室 →较难,二分+差分

 

posted @ 2017-12-02 12:10  dprswdr  阅读(371)  评论(0编辑  收藏  举报