给一组数,找到有多少对
(
i
,
j
)
(i,j)
(i,j)
(
i
<
j
)
(i < j)
(i<j)满足
l
<
=
a
i
+
a
j
<
=
r
l <= {a_i + a_j} <= r
l<=ai+aj<=r。
思路分析
由于我们要求的是
a
i
+
a
j
a_i + a_j
ai+aj,所以无需考虑
i
<
j
i < j
i<j这个条件。
那么我们可以这样想,首先把这组数排序,然后对于每一个
a
i
a_i
ai用
l
o
w
e
r
b
o
u
n
d
lowerbound
lowerbound和
u
p
p
e
r
b
o
u
n
d
upperbound
upperbound求出
l
−
a
i
l - a_i
l−ai和
r
−
a
i
r - a_i
r−ai,再拿这两个结果相减即可得到答案。
代码如下
#include<bits/stdc++.h>usingnamespace std;#defineintlonglongconstint maxn =2e5+10;int a[maxn];signedmain(){int t;
cin >> t;while(t--){int n, l, r;
cin >> n >> l >> r;for(int i =0; i < n; i++){
cin >> a[i];}sort(a, a + n);int ans =0;for(int i =0; i < n; i++){int ll =lower_bound(a + i +1, a + n, l - a[i])- a;int rr =upper_bound(a + i +1, a + n, r - a[i])- a;
ans +=(rr - ll);}
cout << ans << endl;}return0;}