【模板】树状数组 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); }
};
posted @ 2022-11-06 19:17  caijianhong  阅读(60)  评论(0编辑  收藏  举报