https://www.luogu.com.cn/problem/P1102
题意
从一个序列里找到两个数对满足A-B=C
解析
map和双指针都能解决此问题,本文主要探讨二分解法。
对于每个元素
a
[
i
]
a[i]
a[i],我们将其视为
A
A
A,我们只要找到
C
+
B
C+B
C+B的位置即可,但是元素值为
C
+
B
C+B
C+B的个数可能很多,所以我们用
u
p
p
e
r
b
o
u
n
d
,
l
o
w
e
r
b
o
u
n
d
upper_bound,lower_bound
upperbound,lowerbound,找到满足元素个数的区间大小。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
typedef long long ll;
ll a[N];
int main(){
ll n,c;
cin>>n>>c;
for(int i=1;i<=n;i++){
cin>>a[i];
};
sort(a+1,a+1+n);
ll res=0;
for(int i=1;i<=n;i++){
int j=upper_bound(a+i,a+1+n,a[i]+c)-a;
int k=lower_bound(a+i,a+1+n,a[i]+c)-a;
res+=(j-k);
}
cout<<res;
}