题目:
求逆序数
时间限制:
2000 ms | 内存限制:
65535 KB
难度:
5
-
描述
-
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
现在,给你一个N个元素的序列,请你判断出它的逆序数是多少。
比如 1 3 2 的逆序数就是1。
在进行归并排序的时候,用一个变量把合并时的距离加一下就可以求出了。
代码:
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <stack>
#include <cmath>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define N 1000000+20
#define M 1000000+10
#define LL long long
using namespace std;
LL sum;
LL a[N],b[N];
void mix(LL start,LL mid,LL end)
{
LL i=start,j=mid+1,k=0;
while(i<=mid&&j<=end)
{
if(a[i]<=a[j])
{
b[k++]=a[i++];
}
else
{
sum+=mid+1-i;
b[k++]=a[j++];
}
}
while(i!=mid+1)
b[k++]=a[i++];
while(j!=end+1)
b[k++]=a[j++];
for(LL i=0; i<k; i++)
a[start++]=b[i];
}
void mergesort(LL start,LL end)
{
LL mid=(start+end)/2;
if(start<end)
{
mergesort(start,mid);
mergesort(mid+1,end);
mix(start,mid,end);
}
}
int main()
{
LL t;
scanf("%lld",&t);
while(t--)
{
LL n;
sum=0;
scanf("%lld",&n);
for(LL i=0; i<n; i++)
scanf("%lld",&a[i]);
mergesort(0,n-1);
printf("%lld\n",sum);
}
return 0;
}
本文介绍了一种通过归并排序求解序列逆序数的方法。给出的代码实现了对输入序列的逆序数计算,并提供了样例输入输出。适用于解决算法竞赛中的逆序数问题。
540

被折叠的 条评论
为什么被折叠?



