输出逆序数

xiaoxiao2021-02-28  75

#include <bits/stdc++.h> #include<algorithm> using namespace std; int a[100010]; int b[100010]; void Merge(int a[],int s,int m,int e,int tmp[]) { int pb=0; int p1=s,p2=m+1; while(p1<=m&&p2<=e){ if(a[p1]>a[p2]) tmp[pb++]=a[p1++]; else tmp[pb++]=a[p2++]; } while(p1<=m) tmp[pb++]=a[p1++]; while(p2<=e) tmp[pb++]=a[p2++]; for(int i=0;i<e-s+1;i++) a[s+i]=tmp[i]; } long long Count(int a[],int s,int m,int e) { long long result=0; int p1=s,p2=m+1; while(p1<=m&&p2<=e){ if(a[p1]>a[p2]){ result+=e-p2+1; ++p1; } else ++p2; } return result; } long long MergeSort(int a[],int s,int e,int tmp[]) { long long result=0; if(s<e){ int m=s+(e-s)/2; result+=MergeSort(a,s,m,tmp); result+=MergeSort(a,m+1,e,tmp); result+=Count(a,s,m,e); Merge(a,s,m,e,tmp);//从大到小合并,确保排序 } return result; } int main(){ int n; cin>>n; for(int i=0;i<n;++i) cin>>a[i]; printf("%lld",MergeSort(a,0,n-1,b)); return 0; }
转载请注明原文地址: https://www.6miu.com/read-83101.html

最新回复(0)