YTU OJ 3305: 逆序數
阿新 • • 發佈:2018-12-12
3305: 逆序數
題目描述
在一個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為一個逆序。一個排列中逆序的總數就稱為這個排列的逆序數。 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數是4。給出一個整數序列,求該序列的逆序數。
輸入
第1行:N,N為序列的長度(n <= 50000) 第2行:序列中的元素(0 <= A[i] <= 10^9)
輸出
輸出逆序數
樣例輸入
4 2 4 3 1
樣例輸出
4
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; long long int a[50001],b[50001],temp[50001]; int cnt=0; void Merge(int left,int mid,int right) { int i=left,j=mid+1,k=left; while(i<=mid&&j<=right) { if(a[i]>a[j]) { temp[k++]=a[j++]; cnt=cnt+mid-i+1; } else { temp[k++]=a[i++]; } } while(i<=mid) { temp[k++]=a[i++]; } while(j<=right) { temp[k++]=a[j++]; } for(i=left;i<=right;i++) { a[i]=temp[i]; } } void mergesort(int left,int right) { if(left<right) { int mid=(left+right)/2; mergesort(left,mid); mergesort(mid+1,right); Merge(left,mid,right); } } int main() { int n,m,i,j,k; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%lld",&a[i]); } mergesort(1,n); cout<<cnt<<endl; /*for(i=1;i<=n;i++) { cout<<a[i]<<' '; }*/ return 0; }