逆序数的几种求法 您所在的位置:网站首页 逆序数的符号 逆序数的几种求法

逆序数的几种求法

2023-12-26 07:58| 来源: 网络整理| 查看: 265

转载原地址:https://blog.csdn.net/Du_Mingm/article/details/81203260 首先,逆序数的定义

什么叫逆序数

对于某一个数来说,它的逆序数等于在它之前有多少个比它大的数

对于某一个序列来说,逆序数等于所有数的逆序数之和

例如

 序列      5   1    5   2

逆序数   0   1    0   2

序列的逆序数 1+2=3

 

来看逆序数的求法

方法一

首先将定义一个结构体,存数列的值和下标,然后按数值从大到小(数值相同按下标从大到小)sort一下

 

然后建立树状数组,从最大的元素开始,将其标记,即   add(p【i】.id,1)

利用其query(i)查询当前1----i的和

对于第i大的数,由于之前所有比它大的数已经标记,所以query(i)就是当前数的逆序数

 

例如  5  6  3  8  2     其排序之后即是      2   3   5   6   8   将求对应的值的逆序数的问题转化成了求下标对应的逆序数按求逆

         1  2  3  4  5                                    5   3   1   2    4

序数的方法,先求下标的逆序数  即:   0 + 1 + 2 + 2 + 1  =   6 ,答案即是序列的逆序数,

换一种思路来看,  为了避免加入顺序而导致逆序数的不正确,所以从后面开始逆序,因为已经转化成下标的逆序

所以只需看下标即可,  5   3   1   2   4  对于4的逆序只有5,在c[5]+1,

                                                              对于2的逆序有5,3,在c[5]+1,c[3]+1

                                                              其余类似。。。。。

然后对于3来说的树状数组求1~3的和,即是求以3为逆序数(此例是1,2)的数的个数,

同理对于 i 来求1~i 之间的和,就是来求以 i 为逆序数的数的个数,最后求个总和,也就是所要求的该数列的逆序数。

代码:

#include #include #include using namespace std; int c[100010]; typedef struct nodee{ int x,num; }node; node maze[10010]; bool cmp(node u,node v) { if(u.x==v.x) return u.num>v.num; return u.x


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有