【模板】树状数组 BIT/Fenwick
posted on 2021-08-17 09:15:04 | under 模板 | source
可清空
template<int N> struct fenwick{
int t[N + 10];
fenwick() { memset(t, 0, sizeof t); }
void add(int k, int p) {
for (; p <= N; p += p & -p) t[p] += k;
}
int query(int p) {
int res = 0;
for (; p >= 1; p -= p & -p) res += t[p];
return res;
}
};
template<int N,class T=int> struct fenwick{
T t[N + 10], u[N + 10], tag;
fenwick() { memset(u, tag = 0, sizeof u); }
void add(T k, int p) {
for (; p <= N; p += p & -p)
u[p] != tag && (t[p] = 0, u[p] = tag), t[p] += k;
}
T query(int p) {
T ans = 0;
for (; p >= 1; p -= p & -p) ans += (u[p] == tag) * t[p];
return ans;
}
void rollback() { tag++; }
};
template<int N,class T=int> struct segtree{//exfenwick
fenwick<N, T> s, t;
void add(T k, int l, int r) {
s.add(k, l), s.add(-k, r + 1), t.add(k * (l - 1), l), t.add(-k * r, r + 1);
}
T query(int p) { return s.query(p) * p - t.query(p); }
T query(int l, int r) { return query(r) - query(l - 1); }
void rollback() { s.rollback(), t.rollback(); }
};
真·普通平衡树
template<int N> struct fenwick{
int t[N + 10];
fenwick() { memset(t, 0, sizeof t); }
void add(int k, int p) {
for (; p <= N; p += p & -p) t[p] += k;
}
int getrnk(int p) {
int res = 0;
for (; p >= 1; p -= p & -p) res += t[p];
return res;
}
int getkth(int k) {
int p = 0;
for (int j = 21; j >= 0; j--)
if ((p | 1 << j) < N && t[p | 1 << j] < k) k -= t[p |= 1 << j];
return p + 1;
}
};
int x=b(num[i]);
switch(op[i]){
case 1:
t.add(1, x);
break;
case 2:
t.add(-1, x);
break;
case 3:
printf("%d\n", t.getrnk(x - 1) + 1);
break;
case 4:
printf("%d\n", b[t.getkth(b[x])]);
break;
case 5:
printf("%d\n", b[t.getkth(t.getrnk(x - 1))]);
break;
case 6:
printf("%d\n", b[t.getkth(t.getrnk(x) + 1)]);
break;
}
那这位想必是普通线段树了:
int lowbit(int x){ return x & -x; }
template<int N,class T=int> struct fenwick{
T t[N + 10];
fenwick() { memset(t, 0, sizeof t); }
void add(T k, int p) {
for (; p <= N; p += p & -p) t[p] += k;
}
T query(int p) {
T r = 0;
for (; p >= 1; p -= p & -p) r += t[p];
return r;
}
};
template<int N,class T=int> struct segtree{
fenwick<N, T> s, t;
void add(T k, int p) { s.add(k, p), t.add(k * (p - 1), p); }
void add(T k, int l, int r) { add(k, l), add(-k, r + 1); }
T query(int p) { return s.query(p) * p - t.query(p); }
T query(int l, int r) { return query(r) - query(l - 1); }
};
template <int N> struct segtree {
fenwick<N> t1, t2;
void add(int l, int r, mint k) { t1.add(l, k), t1.add(r + 1, -k), t2.add(l, k * (1 - l)), t2.add(r + 1, k * r); }
mint qry(int l, int r) { return t1.qry(r) * r + t2.qry(r) - t1.qry(l - 1) * (l - 1) - t2.qry(l - 1); }
};
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/template-fenwick.html