超简、易懂、手写二分函数题解(求赞)
2026-05-28 17:08:15
发布于:浙江
14阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
long long a[200005];
int q1(int n,int k){//等价lower_bound函数
int q=n+1;
int l=1,r=n;
while(l<=r){
int w=(l+r)/2;
if(a[w]>=k){
q=w;
r=w-1;
}else l=w+1;
}
return q;
}
int q2(int n,int k){//等价upper_bound函数
int q=n+1;
int l=1,r=n;
while(l<=r){
int w=(l+r)/2;
if(a[w]>k){
q=w;
r=w-1;
}else l=w+1;
}
return q;
}
int main(){
int n,k,s=0;cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)s+=q2(n,a[i]-k)-q1(n,a[i]-k);//很轻松吧?
cout<<s;
return 0;
}
时间复杂度O(n log n),空间复杂度O(n),理论下线!!!
比那什么map强多了(勿喷、求赞)
这里空空如也







有帮助,赞一个