HDU 1394 Minimum Inversion Number 线段树和逆序数的应用

来源:互联网 发布:windows mobile 手机 编辑:程序博客网 时间:2024/05/16 16:26

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1394

题意:给出n个数,通过移动,求最小的逆序数对

题解:

      1.主要代码:

sum = sum + (n - 1 - arr2[i]) - arr2[i];
      2.用线段树求初始数组的逆序数对,然后用上面的代码求出最小的逆序数对

#include<iostream>#include<algorithm>using namespace std;#define lx (root<<1)#define rx ((root<<1)|1)#define mid ((left+right)>>1)#define maxs 5010int arr[maxs];int arr2[maxs];int temp[maxs];int n,sum;void put_up(int left ,int right){int cur = 1;int i = left;int j = mid + 1;while (i <= mid && j <= right){if (arr[i] < arr[j])temp[cur++] = arr[i++];else{temp[cur++] = arr[j++];sum += mid - i + 1;}}while (i<=mid)temp[cur++] = arr[i++];while (j<=right)temp[cur++] = arr[j++];for (int k = 1; k < cur;k++){arr[left++] = temp[k];}}int update(int root, int left, int right){if (left == right)return 0;update(lx, left, mid);update(rx, mid + 1, right);put_up(left, right);}int main(){while (scanf("%d", &n) != EOF){sum = 0;for (int i = 1; i <= n; i++){scanf("%d", &arr[i]);arr2[i] = arr[i];}update(1,1,n);int mins = sum;for (int i = 1; i < n; i++){sum = sum + (n - 1 - arr2[i]) - arr2[i];if (mins > sum)mins = sum;}printf("%d\n", mins);}}


0 0
原创粉丝点击