1908-逆序对(归并板子)

传送门

很早很早以前的题了

今天突然开心

就来补一片题解

主要还是写归并排序的

#include<cstdio>
#define ll long long 
using namespace std;

const int maxn=5e5+5;
int a[maxn],r[maxn],n;
ll ans=0;

void msort(int s,int t)
{
    if(s==t) 
        return;
    int mid=s+t>>1;
    msort(s,mid),msort(mid+1,t);
    int i=s,j=mid+1,k=s;
    while(i<=mid&&j<=t)
        if(a[i]<=a[j]) 
            r[k++]=a[i++];
        else 
            r[k++]=a[j++],ans+=(ll)mid-i+1;
    while(i<=mid) 
        r[k]=a[i],k++,i++;
    while(j<=t) 
        r[k]=a[j],k++,j++;
    for(int i=s;i<=t;i++) 
        a[i]=r[i];
}
inline int read()
{
    char ch=getchar();
    int sum=0,k=1;
    while(ch<'0'||ch>'9')
    {
        if(ch=='-') 
            k=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9') 
        sum=sum*10+(ch^48),ch=getchar();
    return sum*k;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) 
        a[i]=read();
    msort(1,n);
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/darlingroot/p/10472698.html
今日推荐