这里记录树状数组的模板,方便记忆和防止忘记。
例题链接如下:
以下代码只是模板及例子,不是该题题解。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
#define int long long
vector<int> nums;
vector<int> t; //tree树状数组
int n;
int lowbit(int x) {
return (x & -x);
}
void add(int pos, int k) //pos是位置索引
{
for (int i = pos; i <= n; i += lowbit(i))
t[i] += k;
}
int ask(int x) { //查前x的数的和
int sum = 0;
for (int i = x; i; i -= lowbit(i)) {
sum += t[i];
}
return sum;
}
int search(int l, int r) //区间查询
{
int ans = 0;
for (int i = l - 1; i; i -= lowbit(i))
ans -= t[i];
for (int i = r; i; i -= lowbit(i))
ans += t[i];
return ans;
}
signed main() {
n = 20;
nums = vector<int>(n + 1);
t = vector<int>(n + 1);
for (int i = 1; i <= 20; i++) {
nums[i] = i;
add(i, nums[i]);
}
cout << ask(5) << endl;
cout << search(3, 7) << endl;
return 0;
}