离散化的树状数组:https://blog.csdn.net/A_Pathfinder/article/details/88042960
这里就提一下和普通树状数组的区别,这里是用要查询的数当作下标,而普通树状数组是直接顺序下标放值,也就是说区别在于
updata函数,普通的是updata(i,k);//这里的i就单纯是区间下标;而求逆序对的时候是updata(a[i],1)。我们每次都是在这个数字大小的位置上添加1,然后去更新树状数组,在计算逆序数的时候,只需要查看一下比这个数小或等于的数有多少个,然后现在的位数减去前面比它小的就是所得这一位的逆序数。所有如果要判断的值过大,就要离散处理了。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000000;
int c[maxn];
int n;
int lowbit(int x){
return x&(-x);
}
void updata(int pos,int k){
for(int i=pos;i<=n;i+=lowbit(i))
c[i]+=k;
}
int getsum(int x){
int ans=0;
for(int i=x;i;i-=lowbit(i)){
ans+=c[i];
}
return ans;
}
int main(){
int nx=0,a;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a);
updata(a,1);
nx+=(i-getsum(a));//用他在的位置减去比他小的个数,就是前面比他大的个数
}
cout<<nx;
return 0;
}