复习---归并排序求逆序对--计蒜客2017noip模拟赛二--蒜头君的排序

Posted hcute(某高中oi渣)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复习---归并排序求逆序对--计蒜客2017noip模拟赛二--蒜头君的排序相关的知识,希望对你有一定的参考价值。

题目链接:https://nanti.jisuanke.com/t/16443

我不会矩阵快速幂,所以只拿了60分,

发现归并排序掌握的并不熟练,借此良机复习一下。

重在归并排序分治思想,要牢记!

#include<iostream>
#include<cstring>
using namespace std;
int n,m,a[30005],s[30005],ans,d[30005];

void msort(int l,int r)
{
    if(l==r)return;//如果只有一个数字就返回,此处还可使L不会大于R,因为L=R的时候就返回了 
    int mid=(l+r)>>1;
    msort(l,mid);
    msort(mid+1,r);
    int i=l,j=mid+1,k=l;
    while(i<=mid&&j<=r){
        if(d[i]<=d[j]){
            s[k]=d[i];k++;i++;
        }
        else{
            s[k]=d[j];k++;j++;
            ans+=mid-i+1;   //ans求逆序对数量,左边的序列中从i到mid递增,所以从i到mid都是大于j的-----------注意 
        }
    } 
    while(i<=mid){//没有进入数组的 与下面功能相同 
        s[k]=d[i];k++;i++;
    }
    while(j<=r){//漏掉的 
        s[k]=d[j];k++;j++;
    }
    for(int i=l;i<=r;i++)d[i]=s[i];//排一下序 
}

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    cin>>m;
    while(m--){
        int l,r;
        cin>>l>>r;
        for(int i=l;i<=r;i++)d[i]=a[i];
        msort(l,r);
        cout<<ans<<endl;
        memset(s,0,sizeof(s));
        memset(d,0,sizeof(d));
        ans=0;
    }
    
    
    return 0;
} 

 

以上是关于复习---归并排序求逆序对--计蒜客2017noip模拟赛二--蒜头君的排序的主要内容,如果未能解决你的问题,请参考以下文章

逆序对的两种求法(复习)

归并排序(归并排序求逆序对数)--16--归并排序--Leetcode面试题51.数组中的逆序对

计蒜客NOIP2017提高组模拟赛day2-直线的交点

C++归并排序求逆序对_模板

归并排序求逆序对

归并排序求逆序对模板(未完待续)