题目1348:数组中的逆序对
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:2893
解决:692
题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
输入:
每个测试案例包括两行:
第一行包含一个整数n,表示数组中的元素个数。其中1 <= n <= 10^5。
第二行包含n个整数,每个数组均为int类型。
输出:
对应每个测试案例,输出一个整数,表示数组中的逆序对的总数。
样例输入:
4
7 5 6 4
样例输出:
5
#include<stdio.h>
#include<cstring>
long long cnt;
int a[100000+100],c[100000+100];
void merge(int a[], int first, int mid, int last, int c[])
{
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
while(i <= m || j <= n)
{
if(j > n || (i <= m && a[i] <= a[j]))
c[k++] = a[i++];
else
{
c[k++] = a[j++];
cnt += (m - i + 1);
}
}
for(i = 0; i < k; i++)
a[first + i] = c[i];
}
void merge_sort(int a[], int first, int last, int c[])
{
if(first < last)
{
int mid = (first + last) / 2;
merge_sort(a, first, mid, c);
merge_sort(a, mid+1, last, c);
merge(a, first, mid, last, c);
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
cnt=0;
memset(c,0,sizeof(c));
merge_sort(a,0,n-1,c);
printf("%lld\n",cnt);
}
return 0;
}