[模板] 归并排序


[模板] 归并排序

#include 

using namespace std;

long long cnt = 0;
int a[1000000+7],b[1000000+7];

void merge_sort(int l,int r){
    if(l >= r) return;///必须>=,因为mid+1可能会大于
    int mid = (l+r)/2;
    merge_sort(l,mid);
    merge_sort(mid+1,r);
    int i = l,j = mid+1,k = l;
    while(i<=mid && j<=r){
        if(a[i]<=a[j])
            b[k++] = a[i++];
        else
            b[k++] = a[j++],cnt+=mid-i+1;///表示从i到mid的数字都大于a[j]都要算一遍
    }
    while(i<=mid)
        b[k++] = a[i++];
    while(j<=r)
        b[k++] = a[j++];
    memcpy(a+l,b+l,(r-l+1)*sizeof(int));
}


int main(){
    std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n;
    cin>>n;
    for(int i = 0;i>a[i];
    merge_sort(0,n-1);
    cout<