zoukankan      html  css  js  c++  java
  • 树状数组求逆序数

    1逆序数一波:

    在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。一个排列中所有逆序总数叫做这个排列的逆序数。也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆序。一个排列中所有逆序总数叫做这个排列的逆序数。

    比如: 2431这个排列,

    其中21,31,41,43,这四个就是逆序对,所以这个逆序数的总数就是4.

    2.树状数组:

      https://www.cnblogs.com/zllwxm123/p/9342044.html

      参考上面那篇博客.

     

    3.用树状数组求逆序数.

      设A[x]为树状数组,现在我们要存的是,x这个数是否出现过,出现过则,A[x]++;

    那么当我们求和的时候就是计算出当前位置之前有多少个数小于本身,那么再根据我本身的位数,

    就可以推出比我本身大的数在我前面有多少位.

    (当然,如果数字很大的话,就需要先进行离散化.)

    例如:

      计算下面一串数字的逆序数总数,

    3425671

    A 数组表示的是i是否出现过,而ans表示的是在此之前有几个数比自身小,cnt数组就表示每个数可能与其后面的数构成逆序数的种数,其和就是总和.

    A[3] 1   ans[1]  0    cnt[1] = 3 - ans[1] - 1 = 2

    A[4] 1           ans[2]  1    cnt[2] = 4 - ans[2] - 1 = 2

    A[2] 1   ans[3]  0    cnt[3] =  2 - ans[3] - 1 = 1

    A[5] 1   ans[4]  3    cnt[4] =  5 - ans[4] - 1 = 1

    A[6] 1   ans[5]  4    cnt[5] =  6 - ans[5] - 1 = 1

    A[7] 1   ans[6]  5    cnt[6] =  7 - ans[6] - 1 = 1

    A[1 ] 1   ans[7]  0    cnt[7] =  1 - ans[7] - 1 = 0

      

  • 相关阅读:
    Docker-CentOS系统安装Docker
    Docker-准备Docker环境
    Docker系列-文章汇总
    商品订单库存一致性问题的思考
    java模板、工厂设计模式在项目中的重构
    2018Java年底总结
    java的AQS中enp没有同步代码块为啥是原子操作
    java使用awt包在生产环境docker部署时出现中文乱码的处理
    初探装饰器模式
    开灯问题
  • 原文地址:https://www.cnblogs.com/zllwxm123/p/9347932.html
Copyright © 2011-2022 走看看