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

3305: 逆序数

时间:2019-03-25 13:24:07      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:cin   str   输入   amp   temp   归并   lse   cpp   for   

题目描述

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
如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;
} 

  

3305: 逆序数

标签:cin   str   输入   amp   temp   归并   lse   cpp   for   

原文地址:https://www.cnblogs.com/mjn1/p/10593150.html

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