最少的交换
题目描述
现在给你一个由 n 个互不相同的整数组成的序列,现在要求你任意交换相邻的两个数字,使序列成为升序序列,请问最少的交换次数是多少?
输入格式
输入包含多组测试数据。每组输入第一行是一个正整数 n(n<500000),表示序列的长度,当 n=0 时。
接下来的 n 行,每行一个整数 a[i](0<=a[i]<=999999999),表示序列中第 i 个元素。
输出
对于每组输入,输出使得所给序列升序的最少交换次数。
样例输入
5
9
1
0
5
4
3
1
2
3
0
样例输出
6
0
#include <iostream> using namespace std; const int maxn = 500010; int a[maxn]; int aux[maxn]; long long sum; int n; void merge(int l, int mid, int r) { int i = l; int j = mid+1; int end1 = mid; int end2 = r; for (int t = l; t <= r; t++) { aux[t] = a[t]; } for (int t = l; t <= r; t++) { if (j > end2) { a[t] = aux[i++]; } else if (i > end1) { a[t] = aux[j++]; } else if (aux[i] > aux[j]) { sum += mid-i+1; a[t] = aux[j++]; } else if (aux[i] <= aux[j]) { a[t] = aux[i++]; } } } void msort(int l, int r) { if (l < r) { int mid = (l + r) / 2; msort(l, mid); msort(mid+1, r); merge(l, mid, r); } } int main(void) { while (cin >> n && n) { sum = 0; for (int i = 0; i < n; i++) { cin >> a[i]; } msort(0, n-1); cout << sum << endl; } return 0; }