社区讨论
30pts 另一种可能
P4719【模板】动态 DP参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhj0qe6c
- 此快照首次捕获于
- 2025/11/03 18:49 4 个月前
- 此快照最后确认于
- 2025/11/03 18:49 4 个月前
在修改点权时。
减贡献是:先递归,后修改。
加贡献是:先修改,后递归。
原因是靠考虑修改时需要用的是旧值还是值。
大概是像这样,不能把
CPPdel() 和 add() 写成一个函数。void del(int x) {
int u = up[top[x]];
if (!u) return;
auto cur = query(1, 1, n, dfn[top[x]], dfn[bot[x]]);
int f0 = cur[0][0], f1 = cur[0][1];
del(u);
g[u][0] -= max(f0, f1);
g[u][1] -= f0;
cur.n = cur.m = 2;
cur[0][0] = cur[1][0] = g[u][0];
cur[0][1] = g[u][1];
cur[1][1] = -inf;
update(1, 1, n, dfn[u], cur);
}
void add(int x) {
int u = up[top[x]];
if (!u) return;
auto cur = query(1, 1, n, dfn[top[x]], dfn[bot[x]]);
int f0 = cur[0][0], f1 = cur[0][1];
g[u][0] += max(f0, f1);
g[u][1] += f0;
cur.n = cur.m = 2;
cur[0][0] = cur[1][0] = g[u][0];
cur[0][1] = g[u][1];
cur[1][1] = -inf;
update(1, 1, n, dfn[u], cur);
add(u);
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...