acm常用数据结构_树状数组
Posted 一只特立独行的猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了acm常用数据结构_树状数组相关的知识,希望对你有一定的参考价值。
树状数组(用于求动态前缀和,下标为1处开始使用):
树状数组(本质):二进制拆分
查询复杂度O(logn)
维护复杂度O(logn)
一维树状数组(每个节点的管辖范围为2的k次方,k是二进制末尾0的个数):
查询思路: sum[1101] -> sum[1100]+sum[1000]+sum[0000] 每次减去一个1后对下标位置相加。
修改思路:对修改位的1位加1,直到越界。tree[1010]修改->1100,10000。。。
#include<iostream>
using namespace std;
const int N = 1e5 + 5;
int a[N];
int n;
int query(int x) {
//前缀查询
int res = 0;
while (x) {
res += a[x];
x -= x & (-x);
}
return res;
}
void add(int x, int val) {
//单点修改
while (x <= n) {
a[x] += val;
x += x & (-x);
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
add(i, x);
}
int k;
cin >> k;
for (int i = 0; i < k; i++) {
int L, R;
cin >> L >> R;
cout << query(R) - query(L-1) << endl;
}
return 0;
}
以上是关于acm常用数据结构_树状数组的主要内容,如果未能解决你的问题,请参考以下文章