码迷,mamicode.com
首页 > 其他好文 > 详细

D - Ultra-QuickSort (POJ - 2299)

时间:2018-02-14 21:32:09      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:cout   while   using   sort   namespace   std   post   长度   pac   

- 题目大意

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

标签:cout   while   using   sort   namespace   std   post   长度   pac   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!