D

- 题目大意

     给出长度为n的序列,每次只能交换相邻的两个元素,问至少要交换几次才使得该序列为递增序列。

- 解题思路

    利用归并排序来求逆序数(特别注意数组的大小,太大的话再开个数组分开装)。

- 代码

#include<iostream>
#include<cstring>
using namespace std;
const long long MAX = 500001;
long long num[MAX];
long long num1[MAX];
long long sum;
void find(int l, int r)
{
	if (l + 1 < r)
	{
		int m = l + (r - l) / 2;
		int p = l, q = m, i = l;
		find(l, m);
		find(q, r);

		while (p < m || q < r)
		{
			if (q >= r || (p < m&&num[p] <= num[q]))
				num1[i++] = num[p++];
			else
			{
				num1[i++] = num[q++];
				sum += m - p;
			}
		}
		for (int i =l; i < r; i++)
			num[i] = num1[i];
	}
}
int main()
{
	int m;
	while (cin >> m)
	{
		if (m == 0)
			break;
		sum = 0;
		memset(num, 0, sizeof(num));
		memset(num1, 0, sizeof(num1));
		for (int j = 0; j <m; j++)
			cin >> num[j];
		find(0, m);
		cout << sum << endl;
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/alpacadh/p/8448900.html