树状数组详解

来源:互联网 发布:淘宝 男装 原单 编辑:程序博客网 时间:2024/05/20 21:47
对于一个数组,当我们需要修改数组中的某些元素的值并查询修改后某区间的和时,对于普通方法必定会超时,而树状数组解决了这一问题。
什么是树状数组?
树状数组(Binary Indexed Tree(BIT), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,
但是每次只能修改一个元素的值;经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个元素的值
(如果加入多个辅助数组则可以实现区间修改与区间查询)。
在树状数组算法中,我们定义一个数组c[],c[i]表示从下表为i开始的向前连续lowbit[i]个数的和,lowbit[i]表示去掉高位的1,

比如lowbit[10]=lowbit[1010]=0010=2。这使得最终无论是c数组的处理或者区间查询的复杂度都降为log[n]

#include<stdio.h>#include<algorithm>using namespace std;const int maxm = 50005;int c[maxm], a[maxm], n;void Plus(int k, int num);int query(int k);int main(){int i, j, k, sum, x, y, m;scanf("%d", &n);for (i = 1;i <= n;i++){scanf("%d", &a[i]);Plus(i, a[i]);}while (scanf("%d%d", &x, &y) != EOF)printf("%d\n", query(y) - query(x) + a[x]);return 0;}void Plus(int k, int num){while (k <= n){c[k] += num;k += k&-k;}}int query(int k){int ans = 0;while (k > 0){ans += c[k];k -= k&-k;}return ans;}


0 0
原创粉丝点击