D - Ultra-QuickSort (POJ - 2299)

Posted Alpacaddhh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D - Ultra-QuickSort (POJ - 2299)相关的知识,希望对你有一定的参考价值。

- 题目大意

     给出长度为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;
}

  

以上是关于D - Ultra-QuickSort (POJ - 2299)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2299 Ultra-QuickSort

POJ 2299.Ultra-QuickSort

POJ 2299 Ultra-QuickSort 题解

POJ2299 Ultra-QuickSort

POJ2299 Ultra-QuickSort

poj2299 Ultra-QuickSort