摘要: 1.用树状数组求逆序数缺点:只能对整数求逆序数 1 #include "TreeArray.h" 2 /* 3 算法: 4 由树状数组求逆序对。加入元素i即把以元素i为下标的a[i]值+1,从队尾到队首入队, 5 每次入队时逆序对数 += getsum(i - 1),即下标比它大的但是值比它小的元素个数。 6 因为树状数组不能处理下标为0的元素,每个元素进入时+1,相应的其他程序也要相应调整。 7 求出原始的序列的逆序对个数后每次把最前面的元素移到队尾,逆序对数即为 8 原逆序对数+比i大的元素个数-比i小的元素个数,因为是0..n,容易直接算出 9 */10 int Ni 阅读全文
posted @ 2013-08-14 15:53 GLSilence 阅读(370) 评论(0) 推荐(0) 编辑
摘要: 做到一道关于求数列逆序数的题,其中提到了树状数组,就学习了一下树状数组。如果给定一个数组,要你求里面所有数的和,一般都会想到累加。但是当那个数组很大的时候,累加就显得太耗时了,时间复杂度为O(n),并且采用累加的方法还有一个局限,那就是,当修改掉数组中的元素后,仍然要你求数组中某段元素的和,就显得麻烦了。所以我们就要用到树状数组,他的时间复杂度为O(lgn),相比之下就快得多。下面就讲一下什么是树状数组:一般讲到树状数组都会少不了下面这个图:下面来分析一下上面那个图看能得出什么规律: 据图可知:c1=a1,c2=a1+a2,c3=a3,c4=a1+a2+a3+a4,c5=a5,c6=a5+a6 阅读全文
posted @ 2013-08-14 15:02 GLSilence 阅读(206) 评论(0) 推荐(0) 编辑