【模板】自动清空数组

这个板子有什么意义?

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

template <class T, int N>
struct acarray {
  T val[N], rev;
  int tim, vis[N];
  struct refer {
    acarray* ptr;
    size_t pos;
    refer() = delete;
    refer(acarray& a, size_t pos) : ptr(&a), pos(pos) {}
    operator T() const {
      return ptr->vis[pos] < ptr->tim ? ptr->rev : ptr->val[pos];
    }
    refer& operator=(const T& x) {
      ptr->vis[pos] = ptr->tim;
      ptr->val[pos] = 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); }
};
posted @ 2023-10-29 14:09  caijianhong  阅读(33)  评论(0编辑  收藏  举报