码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-11-04 00:24:16      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:数组   font   pre   cin   计蒜客   color   归并   style   end   

题目链接: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模拟赛二--蒜头君的排序

标签:数组   font   pre   cin   计蒜客   color   归并   style   end   

原文地址:http://www.cnblogs.com/hcute/p/7780779.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!