树状数组
文章平均质量分 55
不吸血的Vampire
这个作者很懒,什么都没留下…
展开
-
树状数组(一维、二维)入门
(1).一维树状数组:一定要注意数组c的初始化,N是数组的大小,modify的功能是把第n个元素加上delta, 而sum的功能则是求从第一个元素开始到第n个元素之和,当然也可以求一段区间上的和, 比如我要求第x个元素到第y个元素的和,答案就是sum(y) - sum(x - 1) int lowbit( int n ) { return n & (-n); } void modi原创 2013-11-16 22:08:47 · 687 阅读 · 0 评论 -
树状数组求逆序数
逆序数就是数中各位在它前面有多少个数比它大,求出这些元素个数之和。 今天看了个树状数组,可以很好的解决这个问题,普通方法需要O(N^2)复杂度,用树状数组只需要O(NlongN) 树状数组实际上还是一个数组,只不过它的每个元素保存了跟原来数组的一些元素相关的结合值。 若A为原数组,定义数组C为树状数组。C数组中元素C[ i ]表示A[ i –lowbit( i ) + 1]至A[转载 2014-01-18 22:06:55 · 440 阅读 · 0 评论 -
POJ 3067 树状数组求逆序数
题意:日本东海岸有n个城市,西海岸有m个城市,现在要修建k条高铁连接东海岸的城市u和西海岸的城市v。问这k条高铁总共有多少个交点。 #include #include #include #include #include #define M 1005 #define LL long long using namespace std; int原创 2014-01-18 22:11:47 · 435 阅读 · 0 评论 -
树状数组
树状数组,又称二进制索引树,英文名Binary Indexed Tree。 一、树状数组的用途 主要用来求解数列的前缀和,a[0]+a[1]+...+a[n]。 由此引申出三类比较常见问题: 1、单点更新,区间求值。(HDU1166) 2、区间更新,单点求值。(HDU1556) 3、求逆序对。(HDU2838) 二、树状数组的表示 1、公式转载 2014-01-18 21:24:12 · 520 阅读 · 0 评论 -
HDU 2838 (树状数组求逆序数)
题意: 给你N个排列不规则的数(1~N),任务是把它从小到大排好,每次只能交换相邻两个数,交换一次的代价为两数之和,求最小代价 思路:对于当前数X,我们如果知道前面比它大的数有多少,假设为K,那么有部分代价是确定的,那就是K*X;然后还得加上比它大的那些数之和,这就是当数列到X为止,排好所需要的最小代价。 #include #incl原创 2014-04-22 19:23:58 · 810 阅读 · 0 评论 -
HDU 2852 (树状数组求第 k个 大于a 的数)
题意: 三种操作 0 x: 向容器里加入x; 1 x: 在容器内删除x,不存在x则输出“No Elment” 2 x y: 在容器中找到大于x的第y个数,没有则输出“Not Find” 题解: 树状数组 操作1: 直接add(x,1) 操作2: 查找sum(x)和sum(x-1),差值为0则不存在x,反之,add(x,-1)即可删除一个x原创 2014-04-24 21:29:32 · 661 阅读 · 0 评论 -
PKU Ultra-QuickSort (树状数组求逆序数)
题意:就是求逆序数; 思路:我们用一个结构体保存数列的值和下标(num,id); 然后对 num 从大到小排列,算出num之前比num的id还要小的个数,即a[i] > a[j] && i #include #include #include #include #include #include #include #include #include #inclu原创 2014-04-26 10:41:23 · 596 阅读 · 0 评论