思路:
1.一道求逆序数的问题,用树状数组可以解决;
2.将最前面的数(a[i]
)移到最后面时,掌握inversion number
之间递推关系就可以了:
代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int MAX_N=5000+99;
int bit[MAX_N],n,a[MAX_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 clear(){
for(int i=0;i<=n;i++) bit[i]=0;
}
int main(){
while(~scanf("%d",&n)){
int ans=0;
for(int i=0;i<n;i++){
scanf("%d",a+i);
ans+=a[i]-sum(a[i]+1);
add(a[i]+1,1);
}
int min_n=ans;
for(int i=0;i<=n-1;i++){
ans=ans+n-1-(a[i]<<1);
min_n=min(min_n,ans);
}
cout<<min_n<<'
';
clear();
}
return 0;
}