- 1. 题目
- 2. 读题(需要重点注意的东西)
- 3. 解法
- 4. 可能有帮助的前置习题
- 5. 所用到的数据结构与算法思想
- 6. 总结
思路:整数的二分查找
3. 解法---------------------------------------------------解法---------------------------------------------------:
#include4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想using namespace std; const int N = 100010; int n, m; int q[N]; int main() { scanf("%d%d", &n, &m); for (int i = 0; i < n; i ++ ) scanf("%d", &q[i]); while (m -- ) { int x; scanf("%d", &x); int l = 0, r = n - 1; // 二分查起始位置 while (l < r) { int mid = l + r >> 1; if (q[mid] >= x) r = mid; else l = mid + 1; } // 没有起始位置,即没有这个值,输出 -1 -1 if (q[l] != x) cout << "-1 -1" << endl; // 有起始位置,二分查终止位置 else { cout << l << ' '; int l = 0, r = n - 1; while (l < r) { int mid = l + r + 1 >> 1; if (q[mid] <= x) l = mid; else r = mid - 1; } cout << l << endl; } } return 0; }
- 整数的二分
1. 整的二分,推荐完全背下来
2. 整数二分模板
while (l < r)
{
int mid = l + r + 1 >> 1;
if (q[mid] <= x) l = mid;
else r = mid - 1;
}
while (l < r)
{
int mid = l + r >> 1;
if (q[mid] >= x) r = mid;
else l = mid + 1;
}
3. 注意:若 l = mid,则mid = l + r + 1 >> 1;若r = mid,则mid = l + r + 1 >> 1。


![[AcWing]789. 数的范围(C++实现)模板题 [AcWing]789. 数的范围(C++实现)模板题](http://www.mshxw.com/aiimages/31/352714.png)
