二分查詢 - 手寫模板與自帶函式

KS_Fszha發表於2024-07-21

手寫模板

自帶函式

lower_bound()

基礎用法:返回下標:lower_bound(a+1,a+n+1,val,cmp)-a

不加 cmp 時:返回第一個大於等於 \(val\) 的下標。

加 cmp 時 :返回第一個 false 時的下標。

cmp 函式寫法:bool cmp(const int &e,const int &val){}

#include <bits/stdc++.h>
using namespace std;
int n,a[100005];
bool cmp(const int &e,const int &val)
{
	return e>=val;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	int t;
	cin>>t;
	while(t--)
	{
		int x;
		cin>>x;
		cout<<lower_bound(a+1,a+n+1,x,cmp)-a<<endl;
	}
	return 0;
}

這個程式碼寫的是:一個從大到小的有序陣列中,第一個小於 \(x\) 的數的下標是多少。

upper_bound()

基礎用法:返回下標:upper_bound(a+1,a+n+1,val,cmp)-a

不加 cmp 時:返回第一個大於 \(val\) 的下標。

加 cmp 時 :返回第一個 true 時的下標。

cmp 函式寫法:bool cmp(const int &val,const int &e){}

#include <bits/stdc++.h>
using namespace std;
int n,a[100005];
bool cmp(const int &val,const int &e)
{
	return e<val;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	int t;
	cin>>t;
	while(t--)
	{
		int x;
		cin>>x;
		cout<<upper_bound(a+1,a+n+1,x,cmp)-a<<endl;
	}
	return 0;
}

這個程式碼寫的是:一個從大到小的有序陣列中,第一個小於 \(x\) 的數的下標是多少。

總結

在 upper_bound 與 lower_bound 中,更推薦使用 upper_bound ,因為他返回的是第一個 true 的元素,寫 cmp 更加容易且直觀。

唯一要注意的是,upper_bound 的 cmp 函式 \(val\) 在前,\(e\) 在後。( \(val\) 是要查詢的元素,也就是傳的第三個引數。),lower_bound 則與之相反。

相關文章