C. Number of Pairs(排序+二分)
You are given an array aa of nn integers. Find the number of pairs (i,j)(i<j)where the sum of ai+ajai+aj is greater than or equal to l and less than or equal to r (that is, l≤ai+aj≤r).
For example, if n=3, a=[5,1,2] l=4 and r=7, then two pairs are suitable:
i=1 and j=2 (4≤5+1≤7);
i=1 and j=3 (4≤5+2≤7).
Input
The first line contains an integer t (1≤t≤1e4). Then t test cases follow.
The first line of each test case contains three integers n,l,r (1≤n≤2?1e5, 1≤l≤r≤1e9) — the length of the array and the limits on the sum in the pair.
The second line contains nn integers a1,a2,…,an (1≤ai≤1e9).
It is guaranteed that the sum of nn overall test cases does not exceed 2?1e5.
Output
For each test case, output a single integer — the number of index pairs (i,j) (i<j), such that l≤ai+aj≤r.
Example
input
Copy
4
3 4 7
5 1 2
5 5 8
5 1 2 4 3
4 100 1000
1 1 1 1
5 9 13
2 5 5 1 1
output
Copy
2
7
0
1
之前的d3好像也出现过一个类似的题目。
这个题的意思就是说给你一个长度为n的序列和一个l和r,问你序列中有多少数对(i,j)(i<j)并且l<=a[i]+a[j]<=r,
这个题目恰一看是有输对(i<j)的限制,其实他是可以排序,
可以想一下如果一个值的a[i]+a[j]满足条件,可以看看他们的相对位置就算是大的在后面小的在前面,然后你排完序还是一样的,
所以这个题是可以排序的,
#include<iostream> #include<algorithm> using namespace std; const int maxn=1e6+100; typedef long long ll; ll a[maxn]; int main(){ int t; cin>>t; int n; ll l,r; while(t--){ scanf("%d%lld%lld",&n,&l,&r); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); } sort(a+1,a+n+1); ll ans=0; for(int i=1;i<=n;i++){ if(a[i]>=r){ break; } ll li=l-a[i]; ll ri=r-a[i]; int p=lower_bound(a+1,a+n+1,li)-a; int p1=upper_bound(a+1,a+n+1,ri)-a; p1--; if(p>n){ continue; } if(p1>n){ p1=n; } if(p<=i){ p=i+1; } if(p1>=p){ ans+=(p1-p+1);//1 2 3 } } printf("%lld\n",ans); } }