可知n的范围比较小,所以我们可以直接进行枚举
有因为数字也比较小,也不用离散化,直接用数组存储即可
然后进行枚举,枚举中间的奶牛,一一进行枚举前面那头的
然后获得两个范围,再二分出中间的奶牛即可
但是这里有一个细节,我们需要两个二分
一个用来获取小于等于x的最大值
一个用来获取大于等于x的最小值
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e3+10;
int a[N];
int n,res;
int ef(int x)
{
int l=1,r=n;
while(l<r)
{
int mid=l+r>>1;
if(a[mid]>=x)r=mid;
else l=mid+1;
}
return l;
}
int ed(int x)
{
int l=1,r=n;
while(l<r)
{
int mid=l+r+1>>1;
if(a[mid]<=x)l=mid;
else r=mid-1;
}
return l;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
{
if(i==n)continue;
for(int j=i-1;j>=1;j--)
{
int x=a[i],y=a[j];
if(2*x-y>a[n])continue;
int a=ed(3*x-2*y),b=ef(2*x-y);
if(b>a)continue;
res+=(a-b+1);
}
}
cout<<res;
}