水题,归并排序的思想。
ACcode:
#include<stdio.h>
#include<iostream>
using namespace std;
const int size=500000;
__int64 ans;
int arr[size+10],brr[size+10];
void merge(int left,int mid,int right)
{
int i=left,j=mid+1,k=left;
while (i<=mid&&j<=right)
arr[i]<=arr[j]? (brr[k++]=arr[i++]):(brr[k++]=arr[j++],ans+=(mid-i+1));
//左边i到mid中的元素则与r构成逆序对。将逆序数总数加上mid-i+1。
while (i<=mid) brr[k++]=arr[i++];
while (j<=right) brr[k++]=arr[j++];
for (i=left;i<=right;i++) arr[i]=brr[i];
}
void msort(int left,int right)
{
if (left>=right) return ;
int mid=(left+right)>>1;
msort(left,mid);
msort(mid+1,right);
merge(left,mid,right);
}
int main()
{
int i,n;
while (scanf("%d",&n)&&n)
{
for (i=ans=0;i<n;i++) scanf("%d",arr+i);
msort(0,n-1);
printf("%I64d\n",ans);
}
return 0;
}
本文介绍了一种利用归并排序思想计算数组中逆序对数量的方法。通过递归地将数组分为两部分,并在合并过程中计算逆序对,实现了高效计算。文章提供了完整的 C++ 代码实现。
532

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



