通过另建一个数组,按排好序后的位置来存放数字,这个新数组建成树状数组的形式,优化复杂度。
#include<stdio.h>
#include<string>
#define N 100005
int n;
int bit[N];
int a[N];
int sum(int i) {
int s=0;
while(i>0) {
s+=bit[i];
i-=i&-i;
}
return s;
}
void add(int i,int x) {
while(i<=n) {
bit[i]+=x;
i+=i&-i;
}
}
void solve() {
int ans=0;
int j;
for(j=0;j<n;j++) {
ans+=j-sum(a[j]);
add(a[j],1);
}
printf("%d\n",ans);
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
scanf("%d",&n);
int i;
for(i=0;i<n;i++) {
scanf("%d",&a[i]);
}
solve();
return 0;
}