I
来源:互联网 发布:软件著作权和发明专利 编辑:程序博客网 时间:2024/05/17 05:55
The Number of Inversions
For a given sequence
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
Input
In the first line, an integer
output
Print the number of inversions in a line.
Constraints
1≤n≤200,000 0≤ai≤109 ai are all different
Sample Input 1
53 5 2 1 4
Sample Output 1
6
Sample Input 2
33 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;}
阅读全文