关于二分的两个stl函数
该笔记主要记录的是
lower_bound( )与upper_bound( )在日常做题的应用。
1. upper_bound( )
用于寻找数组中第一个大于所寻找元素的元素的下标。
int u=upper_bound(a+1,a+1+n,m)-a;
通常 u - 1是我们所需要的
2.lower_bound( )
用于寻找数组中第一个大于等于所寻元素的元素的下标
int l=lower_bound(a+1,a+1+n,m)-a;
相比较上个函数使用情况较少。
做题时感觉使用 upper_bound( )的情况更多
附上二分模板备忘
#include<iostream>
using namespace std;
int main() {
int n, q;
cin >> n >> q;
int a[n];
int i;
for (i = 0; i < n; i++) {
cin >> a[i];
}
while (q--) {
int k;
int l = 0, r = n - 1;
cin >> k;
while (l < r) {
int mid = (l + r) / 2;
if (a[mid] >= k)
r = mid;
else
l = mid + 1;
}
if (a[l] != k)
cout << "-1 -1" << endl;
else {
cout << l << " ";
int l = 0, r = n - 1;
while (l < r) {
int mid = (l + r + 1) / 2;
if (a[mid] <= k)
l = mid;
else
r = mid - 1;
}
cout << l << endl;
}
}
return 0;
}
~~
~~
#include<stdio.h>
int a[3000015];
int f(int a[], int l, int r, int x) {
int k;
if (l <= r) {
k = (l + r) / 2;
if (a[k] == x)
return k;
if (a[k] > x)
return f(a, l, k - 1, x);
else
return f(a, k + 1, r, x);
}
return -1;
}
int main() {
int n, q, x;
int i, j;
scanf("%d %d", &n, &q);
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for (j = 0; j < q; j++) {
scanf("%d", &x);
printf("%d\n", f(a, 0, n - 1, x));
}
return 0;
}