3305: 逆序数

题目描述

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。
 

输入

第1行:N,N为序列的长度(n <= 50000)
第2行:序列中的元素(0 <= A[i] <= 10^9)
 

输出

输出逆序数

样例输入

4
2 4 3 1

样例输出

4

实际上是归并排序, 顺便求一下逆序数

#include <iostream>
using namespace std;

long long int a[50010], b[50010], temp[50010];
int cnt;

void Merge(int left, int mid, int right)
{
	int i = left, j = mid + 1, k = left;
	while(i <= mid && j <= right)
	{
		if(a[i] > a[j])
		{
			temp[k ++] = a[j ++];
			cnt = cnt + mid - i + 1;
		}
		else
		{
			temp[k ++] = a[i ++];
		}
	}
	while(i <= mid)
	{
		temp[k ++] = a[i ++];
	}
	while(j <= right)
	{
		temp[k ++] = a[j ++];
	}
	for(i = left; i <= right; ++ i)
	{
		a[i] = temp[i];
	}
}

void mergeSort(int left, int right)
{
	if(left < right)
	{
		int mid = left + (right - left) / 2;
		mergeSort(left, mid);
		mergeSort(mid + 1, right);
		Merge(left, mid, right);
	}
}

int main()
{
	int n, m;
	cin >> n;
	for(int i = 1; i <= n; ++ i)
		cin >> a[i];
		
	mergeSort(1, n);
	
//	for(int i = 1; i <= n; ++ i)
//		cout << a[i] << " ";
//	cout << endl;
	
	cout << cnt << endl;
	
	return 0;
} 

  

posted @ 2019-03-25 13:07  青衫客36  阅读(168)  评论(0编辑  收藏  举报