码迷,mamicode.com
首页 > 编程语言 > 详细

C. Number of Pairs(排序+二分)

时间:2021-06-13 10:56:21      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:col   ble   style   rgb   tab   出现   limits   hat   相对   

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); 
    }
}

 

C. Number of Pairs(排序+二分)

标签:col   ble   style   rgb   tab   出现   limits   hat   相对   

原文地址:https://www.cnblogs.com/lipu123/p/14879402.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!