要满足
我们枚举求的个数
加起来即为答案
考虑使用动态开点权值线段树维护
#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; }