您的位置:首页 > 其它

HDU 1394 Minimum Inversion Number (树状数组求逆序对)

2016-04-04 13:50 447 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394

题目让你求一个数组,这个数组可以不断把最前面的元素移到最后,让你求其中某个数组中的逆序对最小是多少。

一开始就求原来初始数组的逆序对,树状数组求或者归并方法求(可以看《挑战程序设计》P178),然后根据最前面的元素大小递推一下每次移到最后得到的逆序数,取最小值。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 5005;
int bit[MAXN] , n , a[MAXN];

inline void add(int i , int num) {
for( ; i <= n ; i += (i & -i))
bit[i] += num;
}

int sum(int i) {
int res = 0;
for( ; i > 0 ; i -= (i & -i))
res += bit[i];
return res;
}

int main()
{
while(~scanf("%d" , &n)) {
memset(bit , 0 , sizeof(bit));
int res = 0 , ans;
for(int i = 0 ; i < n ; i++) {
scanf("%d" , a + i);
a[i]++;
res += i - sum(a[i]);
add(a[i] , 1);
}
ans = res;
for(int i = 0 ; i < n - 1 ; i++) {
ans -= (a[i] - 1);
ans += (n - a[i]);
res = min(res , ans);
}
printf("%d\n" , res);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: