luogu#P1908 逆序对

题意:

给出 \(n\) 个数,求逆序对数

解析:

归并排序

//归并排序
#include<cstdio>
#define N 500005
#define re register 
using namespace std;
int n,a[N],b[N];
long long ans;
void m_sort(int l,int r);
inline int read();
int main()
{
    n=read();
    for(re int i=1;i<=n;i++)
        a[i]=read();
    m_sort(1,n);
    printf("%lld",ans);
    return 0;
}
inline int read()
{
    re int s=0,w=1;
    re char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        s=s*10+ch-'0';
        ch=getchar();
    }   
    return s*w;
}
void m_sort(int l,int r)
{
    if(l==r)
        return ;
    re int mid=(l+r)>>1;
    re int i=l,j=l;
    re int k=mid+1;
    m_sort(l,mid); m_sort(mid+1,r);
    while(i<=mid&&k<=r)
    {
        if(a[i]<=a[k])
            b[j++]=a[i++];
        else
        {
            ans+=mid-i+1;
            b[j++]=a[k++];  
        }
    }
    while(i<=mid)
        b[j++]=a[i++];
    while(k<=r)
        b[j++]=a[k++];
    for(re int i=l;i<=r;i++)
        a[i]=b[i];
}

猜你喜欢

转载自www.cnblogs.com/nenT/p/11761279.html
今日推荐