#include <iostream>//O(NlogN) using namespace std; int a[100005],t[100005],n; long long mergesort(int l,int m,int r){ long long ans=0,sum=0; for(int i=l,j=m+1;j<=r;j++){ while(i<=m&&a[j]>=a[i]){ sum+=a[i++]; } ans+=sum; } int i=l,j=m+1,ti=l; while(i<=m&&j<=r){ if(a[i]<a[j])t[ti++]=a[i++]; else t[ti++]=a[j++]; } while(i<=m)t[ti++]=a[i++]; while(j<=r)t[ti++]=a[j++]; for(int i=l;i<=r;i++)a[i]=t[i]; return ans; } long long smallsum(int l,int r){ if(l==r)return 0; int m=(l+r)/2; return smallsum(l, m)+smallsum(m+1,r)+mergesort(l,m,r); } int main() { cin>>n; for(int i=0;i<n;i++){ scanf("%d",&a[i]); } cout<<smallsum(0,n-1); return 0; }
【算法讲解022【必备】归并分治】 https://www.bilibili.com/video/BV1L14y1B7ef/?share_source=copy_web&vd_source=5065fa61022691e8df35c771a30e6d29