9.15上课日记

part1

逆序对
详见代码
顺带归并排序一起复习


#include<bits/stdc++.h>
using namespace std;
int a[100001],b[100001];
long long ans=0;
void zuhe(int l,int m,int r){
    int i=l,k=l,j=m+1;//i左区间,j右区间 
    while(i<=m&&j<=r){
        if(a[i]>a[j]){//左大于右(逆序了)下来一个右区间
            b[k]=a[j];k++,j++;
            ans+=m-i+1;
        }
        else b[k++]=a[i++];//下来一个左区间(没有逆序) 
    }
    while(i<=m)b[k++]=a[i++];//对于剩余部分直接加入 
    while(j<=r)b[k++]=a[j++];
    for(int i=l;i<=r;i++){//重排
        a[i]=b[i];
    }
}
void guibing(int l,int r){
    if(l<r){
        int m=l+r>>1;
        guibing(l,m);
        guibing(m+1,r);
        zuhe(l,m,r);
    }
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    guibing(1,n);
    cout<<ans;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/lisuier/p/9651788.html