手寫模板
自帶函式
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 則與之相反。