问题描述
给定一个数组 ,以及两个正整数 和 ,求取两个数 和 ,满足 的取法有多少种?
注:只要两个取法有一个角标不同,则视为两种不同的取法。
输入格式
第一行有三个正整数 ,分别代表数组长度,和的下界和上界。
第二行有 个正整数
数据范围:
对于10%的数据,
对于30%的数据,
对于50%的数据,
对于100%的数据,
输出格式
一个整数,代表最后的取法数量。
样例输入
5 2 4
1 4 2 2 1
样例输出
6
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;//在后续定义更方便
const int maxn=10000000+5;//定义多五个,以防溢出。
ll a[maxn];//也可以直接写“ll a[10000005];"
int main()
{
ll n,x,y,ans=0;//ans必须等于0,否则可能过不了
cin>>n>>x>>y;//scanf("%lld%lld%lld",n,x,y)会更快
for(int i=1;i<=n;i++)
cin>>a[i];//for循环输入
sort(a+1,a+n+1);//定义sort函数,方便查找
for(int i=1;i<=n;i++)
{
int l=lower_bound(a+1+i,a+n+1,x-a[i])-a;//从a+1+i到a+n+1找>=x-a[i]
int r=upper_bound(a+1+i,a+n+1,y-a[i])-a;//从a+1+i到a+n+1找>y-a[i]
ans+=r-l;//把答案递增
}
cout<<ans;//输出答案
}