关于二分的两个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;
}
posted @ 2024-07-05 17:37  ZhangDT  阅读(0)  评论(0编辑  收藏  举报