1. 程式人生 > >C++STL之lower_bound()與upper_bound()

C++STL之lower_bound()與upper_bound()

標頭檔案:#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;
}