- C23huangminzhe's blog
树状数组
- 2024-12-4 14:40:22 @
树状数组是一个擅长单改区查的数据结构。
树状数组只能存满足可差分性的数据(如前缀和)。树状数组其实就是前缀和升级版,它相比于前缀和可以存动态数据(修改快)。
树状数组基本形态:
类模板
如果报错,请删除第 3 行。
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long size_t;
template<typename tp>
class BIT{
private:
size_t n;
vector<tp> c;
size_t lowbit(size_t x){
return x & -x;
}
public:
BIT(size_t n){
this->n = n;
c = vector<tp>(n);
}
BIT(vector<tp> a){
n = a.size();
for (size_t i = 1;i <= n;i++){
add(i,a[i]);
}
}
BIT(tp *a,size_t n){
this->n = n;
for (size_t i = 1;i <= n;i++){
add(i,a[i]);
}
}
BIT(BIT<tp> &a){
n = a.size();
c = a;
}
size_t size(){
return n;
}
void add(size_t i,tp val){
for (;i <= n;i += lowbit(i))
c[i] += val;
}
tp query(size_t r){
tp res = 0;
for (;r;r -= lowbit(r))
res += c[r];
return res;
}
tp query(size_t l,size_t r){
return query(r) - query(l - 1);
}
};