【模板】自动清空数组 acarray

发布时间 2023-10-29 14:13:33作者: caijianhong

这个板子有什么意义?

检测对编译器的了解程度。

template <class T, int N>
struct acarray {
  T val[N], rev;
  int tim, vis[N];
  struct refer {
    int *tim, *vis;
    T *val, *rev;
    refer() = delete;
    refer(acarray& a, size_t pos)
        : tim(&a.tim), vis(&a.vis[pos]), val(&a.val[pos]), rev(&a.rev) {}
    operator T() const { return *vis < *tim ? *rev : *val; }
    refer& operator=(const T& x) {
      *vis = *tim;
      *val = x;
      return *this;
    }
    refer& operator=(const refer& r) { return *this = static_cast<T>(r); }
  };
  acarray() : tim(0) { memset(vis, 0, sizeof vis); }
  refer operator[](size_t pos) { return refer(*this, pos); }
  void reset(const T& r) {
    ++tim;
    rev = r;
  }
};

使用例:

template <class T, int N>
struct fenwick {
  acarray<T, N + 10> t;
  fenwick() { reset(); }
  void modify(int p, T k) {
    for (; p <= N; p += p & -p) t[p] = max(static_cast<int>(t[p]), k);
  }
  T query(int p) {
    T r = -1;
    for (; p >= 1; p -= p & -p) r = max(r, static_cast<int>(t[p]));
    return r;
  }
  void reset() { t.reset(-1); }
};