关于树剖 悬关
  • 板块学术版
  • 楼主luogu_mengxin
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/19 22:33
  • 上次更新2024/8/20 08:16:12
查看原帖
关于树剖 悬关
579970
luogu_mengxin楼主2024/8/19 22:33

为啥我的树剖这么慢?

就是 P4211 从一个点跳到根节点的路径 +1?


int sz[N], son[N], fa[N];

void dfs(int u, int f) {
    sz[u] = 1;
    for (int i = head[u]; i; i = e[i].next) {
        int to = e[i].to;
        if (to == f) continue;
        dfs(to, u);
        sz[u] += sz[to];
        if (sz[son[u]] < sz[to]) son[u] = to;
    }
}

int top[N], dfn[N], ver[N], cnt;

void dfs2(int u, int t) {
    top[u] = t, dfn[u] = ++cnt, ver[cnt] = u;
    if (son[u]) dfs2(son[u], t);
    for (int i = head[u]; i; i = e[i].next) {
        int to = e[i].to;
        if (to == son[u] || to == fa[u]) continue;
        dfs2(to, to);
    }
}
...
void modify_path(int x) {
    while (x) {
        modify(1, 1, n, dfn[top[x]], dfn[x], 1);
        x = fa[top[x]];
    }
}

int query_path(int x) {
    int ans = 0;
    while (x) {
        ans += query(1, 1, n, dfn[top[x]], dfn[x]);
        x = fa[top[x]];
    }
    return ans;
}
2024/8/19 22:33
加载中...