P1102 A-B 数对(二分&尺取)

P1102 A-B 数对(二分&尺取)

思路:二分或者尺取,枚举每个 b b 找到对应的等于 b + c b+c 最大区间。

时间复杂度: O ( n l o g n ) O(nlogn)

AC代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#include<set>
using namespace std;
typedef long long ll;
const int N=1e6+5;
#define mst(a) memset(a,0,sizeof a)
int n,a[N],c;
int main(){
	scanf("%d%d",&n,&c);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	sort(a+1,a+n+1);
	ll ans=0;
	for(int i=1;i<=n;i++){
		int l=lower_bound(a+i,a+n+1,a[i]+c)-a;//查找区间[l,r]等于a[i]+c 
		int r=upper_bound(a+i,a+n+1,a[i]+c)-a;
		ans+=r-l; 
	}	
	printf("%lld\n",ans);
	return 0;
}
原创文章 201 获赞 165 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/106118009
今日推荐