求逆序对个数,莫队套树状数组
#include#include #include #include #include #define N 50005using namespace std;int n,m,nn,a[N],c[5000005],be[N],maxn;struct Query{ int l,r,id,ans;}qr[N];bool cmp1(Query a,Query b){ if(be[a.l]==be[b.l]) return a.r qr[i].l){ add(a[--l],1); tot+=query(a[l]-1); } while(r qr[i].r){ tot-=r-l+1-query(a[r]); add(a[r--],-1); } qr[i].ans=tot; }}int main(){ scanf("%d",&n); nn=sqrt(n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); maxn=max(maxn,a[i]); be[i]=(i-1)/nn+1; } scanf("%d",&m); int l,r; for(int i=1;i<=m;i++) { scanf("%d%d",&l,&r); qr[i].l=l; qr[i].r=r; qr[i].id=i; } sort(qr+1,qr+m+1,cmp1); work(); sort(qr+1,qr+m+1,cmp2); for(int i=1;i<=m;i++) printf("%d\n",qr[i].ans); return 0;}