二分算法模板
整数二分
1 /**\ 2 check()函数用来检查是否具有某种性质 3 r = mid 适用于答案往左逼近的情况 4 l = mid 适用于区间答案往右逼近的情况(例如最小最大值) 5 \**/ 6 int bs1(int l, int r) 7 { 8 while (l < r) 9 { 10 int mid = l + r >> 1; 11 if (check(mid)) r = mid; 12 else l = mid + 1; 13 } 14 return l; 15 } 16 17 int bs2(int l, int r) 18 { 19 while (l < r) 20 { 21 int mid = l + r + 1 >> 1; 22 if (check(mid)) l = mid; 23 else r = mid - 1; 24 } 25 return l; 26 } 27 28 29 double bs_3(double l, double r) 30 { 31 const double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求 32 while (r - l > eps) 33 { 34 double mid = (l + r) / 2; 35 if (check(mid)) r = mid; 36 else l = mid; 37 } 38 return l; 39 }