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

求逆序数

时间:2015-07-16 16:40:12      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:

求逆序数

时间限制:2000 ms  |  内存限制:65535 KB
难度:5
描述

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。

现在,给你一个N个元素的序列,请你判断出它的逆序数是多少。

比如 1 3 2 的逆序数就是1。

输入
第一行输入一个整数T表示测试数据的组数(1<=T<=5)
每组测试数据的每一行是一个整数N表示数列中共有N个元素(2〈=N〈=1000000)
随后的一行共有N个整数Ai(0<=Ai<1000000000),表示数列中的所有元素。

数据保证在多组测试数据中,多于10万个数的测试数据最多只有一组。
输出
输出该数列的逆序数
样例输入
2
2
1 1
3
1 3 2
样例输出
0
1

代码1、
#include<stdio.h>
long long a[1000005];
long long t[1000005];
long long count;
void merg(long long *a,int left,int right,long long *t)
{
	if(right-left>1)
	{
		int mid=left+(right-left)/2;
		int p=left,q=mid,i=left;
		merg(a,left,mid,t);
		merg(a,mid,right,t);
		while(p<mid||q<right)
		{
			if(q>=right||(p<mid&&a[p]<=a[q]))
			  t[i++]=a[p++];
			else
			{
				t[i++]=a[q++];
				count=count+mid-p;
			}
			  
		}
		for(i=left;i<right;i++)
		{
			a[i]=t[i];
		}
	}
}
int main(void)
{
	int T,N;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&N);
		for(int i=0;i<N;i++)
		{
			scanf("%lld",&a[i]);
		}
		count=0;
		merg(a,0,N,t);
		printf("%lld\n",count);
	}
	return 0;	
}



代码2、
#include<stdio.h>
long long a[1000005];
long long t[1000005];
long long count;
void merg(long long *a,int left,int right,long long *t)
{
	if(right-left>1)
	{
		int mid=left+(right-left)/2;
		int l=left,r=mid,i=left;
		merg(a,left,mid,t);
		merg(a,mid,right,t);
		while(l<mid&&r<right)
		{
			if(a[l]<=a[r])
			  t[i++]=a[l++];
			else
			{
				t[i++]=a[r++];
				count=count+mid-l;
			}
			  
		}
		while(l<mid)
		{
			t[i++]=a[l++];
		}
		while(r<right)
		{
			t[i++]=a[r++];
			count=count+mid-l;
		}
		for(i=left;i<right;i++)
		{
			a[i]=t[i];
		}
	}
}
int main(void)
{
	int T,N;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&N);
		for(int i=0;i<N;i++)
		{
			scanf("%lld",&a[i]);
		}
		count=0;
		merg(a,0,N,t);
		printf("%lld\n",count);
	}
	return 0;	
}        


版权声明:本文为博主原创文章,未经博主允许不得转载。

求逆序数

标签:

原文地址:http://blog.csdn.net/qq_16997551/article/details/46912835

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