http://acm.hdu.edu.cn/contests/contest_showproblem.php?cid=858&pid=1003
莫队+bit维护
先预处理+k -k位置 会跑快很多
#include<bits/stdc++.h> using namespace std; #define ll long long const int maxn = 27000+5; int unit,tree[maxn],a[maxn],b[maxn],c1[maxn],c2[maxn]; ll res[maxn]; int id[maxn],len,k; struct node{ int l,r,id; } p[maxn]; bool cmp(const node u,const node v){ if(u.l/unit==v.l/unit) return u.r<v.r; return u.l/unit<v.l/unit; } int lowbit(int x){ return x&(-x); } void add(int x,int val){ while(x<maxn){ tree[x]+=val; x+=lowbit(x); } } ll ask(ll x) { ll sum=0; int l=lower_bound(b+1,b+1+len,x-k)-b+1; int r=upper_bound(b+1,b+1+len,x+k)-b+1; for(int i=r-1;i>0;i-=lowbit(i)) sum+=tree[i]; for(int i=l-1;i>0;i-=lowbit(i)) sum-=tree[i]; return sum; } int main() { int n,m; scanf("%d %d %d",&n,&m,&k); for(int i=1; i<=n; i++){ scanf("%d",&a[i]); b[i]=a[i]; } unit = sqrt(n); for(int i=1; i<=m; i++){ scanf("%d %d",&p[i].l,&p[i].r); p[i].id=i; } sort(p+1,p+1+m,cmp); sort(b+1,b+1+n); len=unique(b+1,b+1+n)-(b+1); for(int i=1;i<=n;i++){ id[i]=lower_bound(b+1,b+1+len,a[i])-b+1; } int L=1,R=0; ll ans=0; for(int i=1; i<=m; i++) { while(L<p[i].l) { ans-=ask(a[L])-1; add(id[L],-1); L++; } while(L>p[i].l) { L--; add(id[L],1); ans+=ask(a[L])-1; } while(R<p[i].r) { R++; add(id[R],1); ans+=ask(a[R])-1; } while(R>p[i].r) { ans-=ask(a[R])-1; add(id[R],-1); R--; } res[p[i].id]=ans; } for(int i=1; i<=m; i++) printf("%I64d\n",res[i]); }