社区讨论

求问

P3919【模板】可持久化线段树 1(可持久化数组)参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mjdowgj0
此快照首次捕获于
2025/12/20 10:39
2 个月前
此快照最后确认于
2025/12/20 14:40
2 个月前
查看原帖
rt,每个版本记录上一个版本和最后一次修改,操作链过长就重构。
很神奇的是,必须 5000500010000100002000020000 次重构一次。
CPP
#include <bits/stdc++.h>
#define endl '\n'
#define up(i,l,r) for(ll i=(l),E##i=(r);i<=E##i;++i)
#define dn(i,r,l) for(ll i=(r),E##i=(l);i>=E##i;--i)
using namespace std; typedef long long ll;
constexpr ll N = 5 + 1e6;

int n, m, v, op, p, c;
struct ver {
  int *an, p, c, cnt;
  ver *fa;
} b[N];
int a[N], *an;
bitset<N> ch;
int C = 5000;

void update(int x) {
  if (b[v].cnt < C)
    return void(b[x] = {b[v].an, p, c, b[v].cnt + 1, b + v});
  b[x] = {new int[n + 1], p, c, 1, 0};
  memcpy(an = b[x].an, b[v].an, sizeof(int) * (n + 1));
  ch.reset();
  for (ver* i = b + v; i; i = i->fa)
    if (!ch.test(i->p)) {
      an[i->p] = i->c;
      ch.set(i->p);
    }
}

int query(int x) {
  b[x] = b[v];
  for (ver* i = b + x; i; i = i->fa)
    if (i->p == p)
      return i->c;
  return b[x].an[p];
}

int main() {
  cin.tie(0)->sync_with_stdio(0);
  cin >> n >> m;
  up (i, 1, n) cin >> a[i];
  b[0] = {a, 0, 0, 1, 0};
  up (i, 1, m) {
    cin >> v >> op >> p;
    op & 1 ? void((cin >> c, update(i)))
    : void(cout << query(i) << endl);
  }
  return 0;
}
CPP
// 都不变
int C = 5001;
// 都不变
求解释。

回复

1 条回复,欢迎继续交流。

正在加载回复...