1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #include <iostream> using namespace std; const int N=1e5+10; long long merge_sort(int a[],int l,int r) { if(l>=r) return 0; int mid=l+r>>1; long long res=merge_sort(a,l,mid)+merge_sort(a,mid+1,r); int i=l,j=mid+1,k=0; int b[N]; while(i<=mid&&j<=r) { if(a[i]<=a[j]) b[k++]=a[i++]; else { res+=mid-i+1; b[k++]=a[j++]; } } while(i<=mid) b[k++]=a[i++]; while(j<=r) b[k++]=a[j++]; for(int i=l,j=0;i<=r;i++,j++) a[i]=b[j]; return res; } int main() { int n; cin>>n; int a[N]; for(int i=0;i<n;i++) scanf("%d",&a[i]); long long ans=merge_sort(a,0,n-1); cout<<ans; }
|