C++STL之lower_bound()與upper_bound()
阿新 • • 發佈:2018-12-13
標頭檔案:#include<algorithm>
如果 int a[100];
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
lower_bound(a+1,a+1+n,x)-x:左端點a[1],右端點a[n]以此二分查詢數x,(區間是前閉後開)返回a[i]中第一個大於等於x的下標。
upper_bound(a+1,a+1+n,x)-x:同上,返回a[i]中第一個大於x的下標。
比如 輸入n,m,輸入n個數a[i],輸入m個數b[j],判斷b[j]在a[i]中出現的次數
我們只用先對a[i]進行排序,用upper_bound()找到大於b[j]的下標,用lower_bound()找到大於等於b[j]下標,兩下標相減,得到的就是b[j]在a[i]中出現的次數。比如1 3 3 4 6 6 查詢b[1]為3,upper_bound()找到下標為4(因為我是讓i=1開始),lower_bound()找到下標為2,相減為2,即為b[1]在1 3 3 4 6 6出現的次數。
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; int a[100],b[100]; int main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; sort(a,a+n+1); for(int i=1;i<=m;i++) { cin>>b[i]; int ans=upper_bound(a+1,a+n+1,b[i])-b[i]-(lower_bound(a+1,a+n+1,b[i])-b[i]); cout<<ans<<endl; } return 0; }