社区讨论

30pts 另一种可能

P4719【模板】动态 DP参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mhj0qe6c
此快照首次捕获于
2025/11/03 18:49
4 个月前
此快照最后确认于
2025/11/03 18:49
4 个月前
查看原帖
在修改点权时。
减贡献是:先递归,后修改。
加贡献是:先修改,后递归。
原因是靠考虑修改时需要用的是旧值还是值。
大概是像这样,不能把 del()add() 写成一个函数。
CPP
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 条回复,欢迎继续交流。

正在加载回复...