这一题我是纯用lower_bound
没有用到STL 但是思路都差不多
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=1000005;
int a[N],b[N],i,n,m,pos;
int main(){
cin>>n>>m;
for(i=1; i<=n; i++)
cin>>a[i];
for(i=0; i<m; i++)
cin>>b[i];
for(i=0; i<m; i++)
{
pos=lower_bound(a+1,a+n+1,b[i])-a;
//找到第一个大于等于b[i]的数的位置; if(a[pos]!=b[i])
pos=-1;//如果该地址对应数不等于b[i],则说明b[i]不存在,pos是比第一个大于b[i]的数的地址
if(i!=m-1)
cout<<pos<<" ";
else
cout<<pos<<endl;
}
return 0;}
该题另一个奇妙解法
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
const int N=200005;
ll a[N],sum,i,n,m;
int main()
{
cin>>n>>m;
for(i=0; i<n; i++)
cin>>a[i];
sort(a,a+n);
for(i=0; i<n; i++)
{
ll low=lower_bound(a,a+n,a[i]+m)-a;//找到第一个大于等于a[i]+c的位置;
ll up=upper_bound(a,a+n,a[i]+m)-a;//找到第一个大于a[i]+c的位置;
sum+=up-low;//up-low即为a[i]+m的个数(其中将a[i]看作B,m为C,a[i]+c为A,A=B+C;)
}
cout<<sum<<endl;
return 0;
}