HDU 1394 Minimum Inversion Number(树状数组)

思路:

1.一道求逆序数的问题,用树状数组可以解决;
2.将最前面的数(a[i])移到最后面时,掌握inversion number之间递推关系就可以了:
ans=ans+n12a[i]ans=ans+n-1-2*a[i]

代码:

#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<<'\n';
		clear();
	}
	return 0;
}
posted @ 2019-11-26 14:54  YuhanのBlog  阅读(73)  评论(0编辑  收藏  举报