二分与三分
设置越界下标确定是否存在 1 //>=x 2 while(l<r){ 3 int mid((l+r)>>1); 4 if(a[mid]>=x) r=mid; 5 else l=mid+1; 6 } 7 //<==x 8 while(l<r) 9 { 10 int mid((l+r+1)>>1); 11 if(a[mid]<=x) l=mid; 12 else r=mid-1; 13 } 14 //setprecision(3) 15 while(l+(1e-5)<r) 16 { 17 double mid=(l+r)/2; 18 if(calc(mid)) r=mid; 19 else l=mid; 20 } 21 FOR(i,0,100) 22 { 23 double mid((l+r)/2); 24 if(calc(mid)) r-mid; 25 else l=mid; 26 } 从学oi到现在,二分思想是逐渐发挥其威力的。其思想跟数学归纳法很像: 并不直接解决问题,而是将问题转化为几个相同的规模较小的问题。对于很简单的子问题(边界条件),直接给出答案。 对于高级数据结构,像线段树,平衡树都是基于二分思想 可以说,二分是算法大楼的重要根基之一。 用二分法配合基础算法打暴力,往往会有意想不到的收获。 对于有单调性的序列,二分能够在O(logn)的时间内进行查找。 具体应用: 1.