lower_bound和upper_bound函数和我们通常理解的概念不一样,lower_bound返回的是第一个大于等于k的数,upper_bound返回的是第一个大于k的数,因此做题的时候在选择函数方面需要稍加斟酌
函数用法 lower_bound(a,a+数组元素个数,k)-a 返回的值为第一个大于等于k的数的数组索引
它的参数就是:
1.一个数组元素的地址(或者数组名来表示这个数组的首地址,用来表示这个数组的开头比较的元素的地址,不一定要是首地址,只是用于比较的“首”地址),
2.一个数组元素的地址(对应的这个数组里边任意一个元素的地址,表示这个二分里边的比较的"结尾’地址),
3.就是一个你要二分查找的那个数。
返回值就是返回第一次出现大于等于那个要查找的数的地址
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a[100000],b[100000],c[100000];
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
cin>>b[i];
}
for(int i=0;i<n;i++){
cin>>c[i];
}
int sum1=0,sum2=0,sum=0;
for(int i=0;i<n;i++){
cout<<"比b["<<i<<"]"<<"小的有"<<lower_bound(a,a+n,b[i])-a-1+1<<"个"<<endl;
sum1=lower_bound(a,a+n,b[i])-a-1+1;
cout<<"比b["<<i<<"]"<<"大的有"<<n-(upper_bound(c,c+n,b[i])-c)<<"个"<<endl;
sum2=n-(upper_bound(c,c+n,b[i])-c)+1-1;
sum+=sum1*sum2;
}
cout<<sum;
}