lower_bound()
1.用法
int pos = lower_bound(arr,arr+n,aim)-arr;
2.在非递减的arr数组内二分查找[l,r)区间内的值为aim的元素。返回aim在数组中的下标。
3.特殊情况
-
如果m在区间中没有出现过,那么返回第一个比m大的数的下标。
-
如果m比所有区间内的数都大,那么返回r。这个时候会越界,小心**。**
-
如果区间内有多个相同的m,返回第一个m的下标。
-
时间复杂度:一次查询O(log n),n为数组长度。
注意:m可以是pair等等。还有下标从0开始还是从1开始。
4.示例
#include<bits/stdc++.h> //万能头文件
using namespace std;
#define max 0x3f3f3f3f //无穷大
int main() {
int n, pos;
cin >> n;
int arr[2*n];
memset(arr, max, sizeof(arr)); //初始化数组arr为max
for (int i = 0; i < n; i++) {
int m;
cin >> m;
pos = lower_bound(arr, arr + n, m) - arr;
arr[pos] = m;
}
cout << lower_bound(arr, arr + n, max) - arr;
return 0;
}