题解:CF2051D Counting Pairs
CF2051D Counting Pairs
思路
首先给数组排个序,然后再暴力枚举 \(i\),不难发现所有符合的 \(j\) 一定是连续的,所以再二分计算出符合数列的开头以及结尾。
AC 代码
有注释。
#include<bits/stdc++.h>
using namespace std;
#define N 300005
long long t,n,x,y,a[N],ans,sum;
int main(){
cin>>t;
while(t--){
cin>>n>>x>>y;
sum=ans=0;
for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i];
sort(a+1,a+n+1);
for(long long i=1;i<=n;i++){
long long pos1=lower_bound(a+i+1,a+n+1,sum-y-a[i])-a;//开头
long long pos2=upper_bound(a+i+1,a+n+1,sum-x-a[i])-a-1;//结尾
if(sum-y-a[i]<=a[pos1]&&a[pos2]<=sum-x-a[i]) ans+=pos2-pos1+1;//前提是在a数组里面都找到了+别忘了+1
}
cout<<ans<<endl;
}
return 0;
}

浙公网安备 33010602011771号