首页 > 其他分享 >5708: 逆序对 归并排序

5708: 逆序对 归并排序

时间:2023-08-16 21:22:47浏览次数:37  
标签:归并 5708 int long pb ++ pa 逆序

描述

 

 

给定 一个序列,求其逆序对的总数。所谓逆序对是指:序列a中存在两个元素a[i]和a[j],满足 i < j 且 a[i]>a[j],则a[i]和a[j]为一个逆序对。

 

 

输入

 

 

第一行为正整数n(n<=100000)。

第二行有n个正整数,最大不超过1000000。

 

 

输出

 

 

输出逆序对的总数。

 

 

样例输入

 

5
5 2 1 3 4

样例输出

 5
#include<stdio.h>
long long a[100001];
long long b[100001];
long long n;
long long count=0;//计数 
void M(long long a[],int start,int mid,int end,long long b[])//降序 
{
    int r=0;
    int pa=start;
    int pb=mid+1;
     
        while(pa<=mid&&pb<=end)
        {
            if(a[pa]>a[pb])
            {
                b[r++]=a[pa++];
                count=count+end-pb+1;
            }
              
            else
            {
                b[r++]=a[pb++];
                
            }
              
        }
        while(pa<=mid)
           b[r++]=a[pa++];
        while(pb<=end)
           b[r++]=a[pb++];
    
    for(int i=0;i<end-start+1;i++)
       a[start+i]=b[i];
    
}
void Msort(long long a[],int start,int end,long long b[])
{
    if(start<end)
    {
        int mid=start+(end-start)/2;
        Msort(a,start,mid,b); 
        Msort(a,mid+1,end,b);
        M(a,start,mid,end,b);
    }
    
}
int main()
{    
    scanf("%lld",&n);
    for(long long i=0;i<n;i++)
    {
        scanf("%lld",&a[i]);
    }
    Msort(a,0,n-1,b);
    printf("%lld",count);
    return 0;
}

 

 

标签:归并,5708,int,long,pb,++,pa,逆序
From: https://www.cnblogs.com/jyssh/p/17636221.html

相关文章

  • 归并排序(递归)(NB)
    博客地址:https://www.cnblogs.com/zylyehuo/递归思路#_*_coding:utf-8_*_importrandomdefmerge(li,low,mid,high):i=lowj=mid+1ltmp=[]whilei<=midandj<=high:#只要左右两边都有数ifli[i]<li[j]:......
  • 算法——初级排序算法之归并排序
    介绍将两个有序的数组归并成一个更大的有序数组,这种算法叫归并排序特点优点:能够保证将任意长度为N的数组排序所需时间和NlogN成正比缺点:所需的额外空间和N成正比1、**原地归并**实现归并的一种直截了当的办法是将两个不同的有序数组归并到每三个数组中,两个数组中的元素......
  • 某公司笔试题 - 句子逆序(附python代码)
    #将一个英文语句以单词为单位逆序排放。例如“Iamaboy”,逆序排放后为“boyaamI”,所有单子之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符#数据范围:输入的字符串长度满足1<=n<=1000importrestr1=input("请输入一个英语句子:")#通过正则匹配输入英......
  • 王道408---冒泡排序、快速排序、直接插入排序、希尔排序、二路归并排序、简单选择排序
    一、冒泡排序冒泡排序属于交换类的排序//时间复杂度:O(n^2)//空间复杂度:O(1)//稳定排序算法#include<stdio.h>#include<iostream>usingnamespacestd;intarr[16];voiddebug(){for(inti=1;i<16;i++){printf("%d",arr[i]);}puts("......
  • 7-3 逆序的三位数 (10分)
    7-3 逆序的三位数 (10分)程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。输入格式:每个测试是一个3位的正整数。输出格式:输出按位逆序的数。输入样例:123输出样例:321鸣谢安阳师范学院软件学院李康康......
  • 总结: [01背包] 空间优化后内层循环为啥是逆序的?
    总结:[01背包] 空间优化后内层循环为啥是逆序的?首先,这是一个困扰了不少人的问题,虽然网上有挺多的解释,但是有的想起来比较费劲,于是乎,就有了这篇题解题目分析首先,01背包问题是一个非常非常非常经典的动态规划问题(后文简称“动规”或“dp”)。 因为百度百科上的题目分析......
  • 算法-15-归并排序
       ......
  • java常见的排序算法(冒泡排序、选择排序、插入排序、shell排序、归并排序、堆排序、快
    文章目录一、冒泡排序1、效率表现和适用范围2、算法实现二、选择排序1、效率表现和适用范围2、算法实现三、插入排序1、效率表现和适用范围2、算法实现四、shell排序1、效率表现和适用范围2、算法实现五、归并排序1、效率表现和适用范围2、算法实现六、快速排序1、效率表现和适用......
  • 归并排序
    求逆序对我用的是归并排序直接上我在洛谷里做的那道逆序对的题目的归并排序主要代码吧1voidmsort(intl,intr){2if(l>=r)return;3intmid=(l+r)>>1;4msort(l,mid);5msort(mid+1,r);6inti=l,j=mid+1,k=l;7......
  • 动态逆序对
    [CQOI2011]动态逆序对考虑CDQ分治。可以对于每个数记录一个时间戳,表示它被删除的时间(为了树状数组的维护方便,我们记时间戳越大者删除时间越早)。然后逆序对的下标是一维,数值是一维,转换成了一个三维偏序问题。我们对于每个数,考虑由它构成的逆序对,且它的时间戳为二者中较大者构......