要满足
我们枚举求
的个数
加起来即为答案
考虑使用动态开点权值线段树维护
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,x,y;
struct oppo{
int l,r;
int siz;
}c[4000006];
int ans,tot,rt;
int ask(int bh,int l,int r,int cl,int cr)
{
if(!bh) return 0;
if(cl<=l&&r<=cr) return c[bh].siz;
int mid=(l+r)/2,ans=0;
if(cl<=mid) ans+=ask(c[bh].l,l,mid,cl,cr);
if(cr>mid) ans+=ask(c[bh].r,mid+1,r,cl,cr);
return ans;
}
void add(int &bh,int l,int r,int k)
{
if(!bh) bh=++tot;
if(l==r){
c[bh].siz++;
return;
}
int mid=(l+r)/2;
if(k<=mid) add(c[bh].l,l,mid,k);
else add(c[bh].r,mid+1,r,k);
c[bh].siz=c[ c[bh].l ].siz+c[ c[bh].r ].siz;
}
signed main()
{
cin>>n>>x>>y;
for(int i=1;i<=n;i++){
int k;
scanf("%lld",&k);
ans+=ask(rt,0,1e9,max(0ll,x-k),max(0ll,y-k));
add(rt,0,1e9,k);
}
cout<<ans<<"\n";
return 0;
}
京公网安备 11010502036488号