二分查找模板
找到从左往右数第一个
#define ll long long
ll find_l(ll x, ll l, ll r) { ll mid = 0; while (l < r)//最后会相等 { mid = l + (r - l) / 2;//向下取整,为什么不写成(l+r)/2,防止有时候会数据溢出 if (a[mid] >= x) r = mid; else l = mid + 1;//向下取整是左边要加1,不然会陷入死循环 } if (a[l] == x)//此处必须是a[l],因为如果为a[mid],mid少算一次 return l; else return -1; }
找到从右往左数第一个
ll find_r(ll x, ll l, ll r) { ll mid = 0; while (l < r) { mid = l + (r - l) / 2 + 1;//向上取整 if (a[mid] > x) r = mid - 1;//向上取整是右边要加1,不然会陷入死循环 else l = mid; } if (a[l] == x) return l; else return -1; }

浙公网安备 33010602011771号