树状数组求逆序对,首先将该数组离散化,一定一定要去重!!
离散化模板:
for(int i=1;i<=n;i++) cin>>a[i],d[i]=a[i];
sort(a+1,a+n+1); //离散化
int len=unique(a+1,a+n+1)-a-1;
for(int i=1;i<=n;i++) d[i]=lower_bound(a+1,a+len+1,d[i])-a;
AC代码:
#include <iostream>
#include <algorithm>
#define MAXN 500005
using namespace std;
int a[MAXN],d[MAXN],ra[MAXN],t[MAXN],n;
int lowbit(int x){
return x&-x;
}
void add(int x,int k){ //a[x]+k
for(;x<=n;x+=lowbit(x)){
t[x]+=k;
}
}
int ask(int x){
int sum=0;
for(;x;x-=lowbit(x)){
sum+=t[x];
}
return sum;
}
int main(){
int T;cin>>T;
while(T--){
long long ans=0;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],d[i]=a[i],t[i]=0;
sort(a+1,a+n+1); //离散化
int len=unique(a+1,a+n+1)-a-1;
for(int i=1;i<=n;i++) d[i]=lower_bound(a+1,a+len+1,d[i])-a;
for(int i=1;i<=n;i++){
ans+=min(ask(d[i]-1),i-1-ask(d[i]));
add(d[i],1);
}
cout<<ans<<endl;
}
return 0;
}