逆序对做题报告

题解写的很好

FIRST SECOND

AC代码

#include<cstdio>
#include<cctype> 
#define ll long long
ll n,a[1000010],temp[1000010],ans;
inline void read(ll &x) {
    char c=0;
    x = 0;        
    int y = 1;
    for (c = getchar(); (c > '9' || c < '0') && c != '-'; c = getchar());
    c == '-' ? y = -1 : x = (c & 15);
    for (c = getchar(); c >= '0' && c <= '9'; c = getchar())
        x = x * 10 + (c & 15);
    x *= y;
}
inline void print(int x){
    if(x<0)x=-x,putchar('-');
    if(x>9)print(x/10);
    putchar(x%10+'0');
}
inline void magre(int l,int mid,int r){
    int i=l,j=mid+1,n=mid,m=r,k=l;
    while(i<=n&&j<=m){
        if(a[i]<=a[j]){
            temp[k++]=a[i++];
        }else{
            ans+=j-k;
            temp[k++]=a[j++];
        }
    }
    while(i<=n){
        temp[k++]=a[i++];
    }
    while(j<=m){
        temp[k++]=a[j++];
    }
    for(int i=l;i<=r;i++){
        a[i]=temp[i];
    }
}
inline void msort(int l,int r){
    if(l<r){
        int mid=(l+r)/2;
        msort(l,mid);
        msort(mid+1,r);
        magre(l,mid,r);
    }
}
int main(){
    read(n);
    for(int i=0;i<n;i++){
        read(a[i]);
    }
    msort(0,n-1);
    printf("%lld",ans);
}
posted @ 2018-11-05 23:21  加固文明幻景  阅读(3)  评论(0编辑  收藏  举报  来源