首页 > 其他分享 >信息学一本通 1311:【例2.5】求逆序对

信息学一本通 1311:【例2.5】求逆序对

时间:2022-09-03 12:02:14浏览次数:50  
标签:1311 int mid ++ left include 2.5 逆序

时间限制: 1000 ms         内存限制: 65536 KB

提交数: 41023     通过数: 9681

【题目描述】

给定一个序列a1,a2,…,ana1,a2,…,an,如果存在i<ji<j并且ai>ajai>aj,那么我们称之为逆序对,求逆序对的数目。

【输入】

第一行为nn,表示序列长度,接下来的nn行,第i+1i+1行表示序列中的第ii个数。

【输出】

所有逆序对总数。

【输入样例】

4
3
2
3
2

【输出样例】

3

【提示】

N≤105,Ai≤105N≤105,Ai≤105。

#include <iostream>
#include <set>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#define A 100000+5

using namespace std;

int a[A],b[A];
long long sum=0;   //注意

void msort(int left,int right);

int main()
{
    int n;
    cin>>n;

    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    msort(1,n);
    cout<<sum<<endl;

    return 0;
}

void msort(int left,int right)
{
    if(left>=right) return ;

    int mid=(left+right)/2;

    msort(left,mid);
    msort(mid+1,right);

    int i=left,j=mid+1,k=left;
    while(i<=mid&&j<=right)
    {
        if(a[i]>a[j])
        {
            b[k++]=a[j++];
            sum+=mid-i+1;           //例如:3 4 7和1 5 8比较,对于7>5>1,所以存在2个逆序对
        }                           //因为相当于a[i]数组中进入b数组的个数
        else  b[k++]=a[i++];
    }

    while(i<=mid)
        b[k++]=a[i++];
    while(j<=right)
        b[k++]=a[j++];
    for(i=left;i<=right;i++)
        a[i]=b[i];
}

#endif

  

标签:1311,int,mid,++,left,include,2.5,逆序
From: https://www.cnblogs.com/sd129/p/16652303.html

相关文章

  • macOS12.5安装Xcode
    1最好是直接去官网下载历史版本的安装包,下载下来安装就好了;2如果你选择APPstore,下载+安装可能要好久,可能网络好的时候很快下载完,但是会一直卡在安装页面:  这个时候......
  • 2022-08-19 记录一下 奥睿科 2.5/3.5英寸双盘位USB3.0硬盘底座 使用感受
    什么?电脑识别不了硬盘???我把京东客服给骂了,再到我写这个随笔的时候,有点心疼那个京东客服。为了扩容,昨天入手了希捷的2t机械家用盘,以及这次的主角奥睿科硬盘底座,简称硬盘盒......
  • Linux c++ 试验-10 一例undefined reference to symbol 'pthread_create@@GLIBC_2.2.5
    最近在编写一个程序时(x64Linux,Arm下没有这个问题),出现了undefinedreferencetosymbol'pthread_create@@GLIBC_2.2.5'”,明明有设置-pthread(l60870里用到了这个库)。经过......
  • 洛谷 P3157 [CQOI2011]动态逆序对
    Description对于序列\(a\),它的逆序对数定义为集合\[\{(i,j)|i<j\anda_i>a_j\}\]中的元素个数。现在给出\(1\simn\)的一个排列,按照某种顺序依次删除\(m\)个......
  • 排列与逆序对
    现在有一个排列\(T\),我们想要通过交换相邻元素的方式来让它变成升序的一个排列,需要的最小交换次数是多少呢答案其实就是排列\(T\)中的逆序对数,因为我们可以发现,逆序对数为......