树状数组+离散化求逆序数poj2299Ultra-QuickSort
来源:互联网 发布:王奕霏编程 编辑:程序博客网 时间:2024/06/05 13:25
Description
Ultra-QuickSort produces the output
Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.
Input
Output
Sample Input
59105431230
Sample Output
60逆序数就是数中各位在它前面有多少个数比它大,求出这些元素个数之和。
今天看了个树状数组,可以很好的解决这个问题,普通方法需要O(N^2)复杂度,用树状数组只需要O(NlongN)
树状数组实际上还是一个数组,只不过它的每个元素保存了跟原来数组的一些元素相关的结合值。
若A为原数组,定义数组C为树状数组。C数组中元素C[ i ]表示A[ i –lowbit( i ) + 1]至A[ i ]的结合值。
lowbit(i)是i的二进制中最后一个不为零的位数的2次方,可以这样计算
lowbit(i)=x&(-x)
lowbit(i)=x&(x^(x-1))
当想要查询一个sum(n)时,可以依据如下算法即可:
step1: 令sum = 0,转第二步;step2: 假如n <= 0,算法结束,返回sum值,否则sum = sum + Cn,转第三步;step3: 令n = n – lowbit(n),转第二步。
n = n – lowbit(n)这一步实际上等价于将n的二进制的最后一个1减去。而n的二进制里最多有log(n)个1,所以查询效率是log(n)的。
修改一个节点,必须修改其所有祖先,最坏情况下为修改第一个元素,最多有log(n)的祖先。所以修改算法如下(给某个结点i加上x):
step1: 当i > n时,算法结束,否则转第二步;step2: Ci = Ci + x, i = i + lowbit(i)转第一步。
i = i +lowbit(i)这个过程实际上也只是一个把末尾1补为0的过程。
求逆序的思路:
可以把数一个个插入到树状数组中, 每插入一个数, 统计比他小的数的个数,对应的逆序为 i- getsum( data[i] ),其中 i 为当前已经插入的数的个数, getsum( data[i] )为比 data[i] 小的数的个数,i- getsum( data[i] ) 即比 data[i] 大的个数, 即逆序的个数。最后需要把所有逆序数求和,就是在插入的过程中边插入边求和。
下面是代码:
- 树状数组+离散化求逆序数poj2299Ultra-QuickSort
- poj2299Ultra-QuickSort【树状数组求逆序数、离散化】、【归并排序模板】
- poj2299Ultra-QuickSort【线段树求逆序数】离散化
- poj2299Ultra-QuickSort(树状数组+离散化)
- Ultra-QuickSort(离散化+树状数组求逆序数)
- poj2299 Ultra-QuickSort&&NYOJ117 求逆序数 (树状数组求逆序对数+离散化)+(归并排序)
- 【树状数组】poj2299 Ultra-QuickSort(离散化+树状数组求逆序数)
- poj2299Ultra-QuickSort(归并求逆序数)
- 离散化+树状数组求逆序数
- 树状数组离散化求逆序数
- 树状数组+ 离散化 求逆序数
- POJ2299 Ultra-QuickSort——树状数组求逆序数+离散化
- poj2299 Ultra-QuickSort(树状数组求逆序数,离散化)
- POJ 2299 Ultra-QuickSort (树状数组求逆序数+离散化)
- poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)
- poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)
- poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)
- 树状数组 离散化 求逆序数POJ 2299Ultra-QuickSort解题报告
- Java进阶之reflection(反射机制)——反射概念与基础
- 校招一些事儿
- 使用 SSHFS 挂载远程的 Linux 文件系统及目录
- 51nod 1305 Pairwise Sum and Divide
- OpenCV21(金字塔LK光流算法)
- 树状数组+离散化求逆序数poj2299Ultra-QuickSort
- 11
- Android启动模式
- DB2 mainframe support UNICODE
- 【codeforces 732D】【二分+贪心】
- 判断2..100以内的质数--sqrt
- 死锁剖析
- android studio使用Aidl跨进程调用服务
- 微信网页小游戏开发实践——走过的坑