The Number of Inversions
For a given sequence A={a0,a1,...an−1}, the number of pairs (i,j) where ai>aj and i<j, is called the number of inversions. The number of inversions is equal to the number of swaps of Bubble Sort defined in the following program:
bubbleSort(A)
cnt = 0 // the number of inversions
for i = 0 to A.length-1
for j = A.length-1 downto i+1
if A[j] < A[j-1]
swap(A[j], A[j-1])
cnt++
return cnt
For the given sequence A, print the number of inversions of A. Note that you should not use the above program, which brings Time Limit Exceeded.
Input
In the first line, an integer n, the number of elements in A, is given. In the second line, the elements ai (i=0,1,..n−1) are given separated by space characters.
output
Print the number of inversions in a line.
Constraints
- 1≤n≤200,000
- 0≤ai≤109
- ai are all different
Sample Input 1
5 3 5 2 1 4
Sample Output 1
6
Sample Input 2
3 3 1 2
Sample Output 2
2
这道题的坑点就是,下标以及统计次数sum都要用long类型,而不能用int,不然会WA,我感觉很奇怪,有的题20w的数据int可以放的下,有的却不行,希望大家知道原因的告诉我。
#include<iostream>
using namespace std;
typedef long long ll;
const long maxn=200005;
const ll maxv=1e9+5;
long sum=0;
void Merge(ll*a,long left,long mid,long right)
{
long n1=mid-left,n2=right-mid;
ll *L,*R;
L=new ll [n1+1];R=new ll [n2+1];
for(long i=0;i<n1;i++)
L[i]=a[left+i];
for(long j=0;j<n2;j++)
R[j]=a[mid+j];
L[n1]=R[n2]=maxv;
long m=0,n=0;
for(long i=left;i<right;i++)
{
if(L[m]<=R[n]){a[i]=L[m];m++;}
else
{
sum+=n1-m;
a[i]=R[n];
n++;
}
}
}
void Merge_Sort(ll*a,long left,long right)
{
if(left<right-1)
{
long mid=(left+right)/2;
Merge_Sort(a,left,mid);
Merge_Sort(a,mid,right);
Merge(a,left,mid,right);
}
}
int main()
{
long n;
ll a[maxn];
cin>>n;
for(long i=0;i<n;i++)
cin>>a[i];
Merge_Sort(a,0,n);
cout<<sum<<endl;
return 0;
}
本文介绍了一种高效的逆序对计数算法,通过合并排序的思想实现,避免了使用冒泡排序带来的超时问题。文章提供了完整的C++代码实现,并强调了在处理大数据集时使用long类型的重要性。
3311

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



