首页 > 其他分享 >一种点分治树的写法

一种点分治树的写法

时间:2024-11-05 16:44:10浏览次数:1  
标签:sz getsz int 分治 一种 vis lst mxsz 写法

大意就是用 vector 直接记录

  1. 无需显式建出叶向树,只需记录 fa。
  2. dis 每个中只用记录 dep 个值,常数比 map 等小。
  3. 但是从上向下不太好做,加点删点是比较好做的。
void getsz(int u, int lst = 0) {
    mxsz[u] = 0; sz[u] = 1;
    for (int v : G[u]) if (!vis[v] && v != lst) {
        getsz(v, u);
        cmax(mxsz[u], sz[v]);
        sz[u] += sz[v];
    }
    cmax(mxsz[u], all - sz[u]);
    if (mn > mxsz[u]) mn = mxsz[u], rt = u;
}
void getdis(int u, int d, int lst) {
    dis[u].eb(d);
    for (int v : G[u]) if (!vis[v] && v != lst) {
        getdis(v, d + 1, u);
    }
}
void build(int u) {
    getsz(u);
    cnt[u] = _cnt_begin; _cnt_begin += sz[u] + 1;//这是那道题的一个桶
    getdis(u, 0, 0);
    vis[u] = 1;
    for (int v : G[u]) if (!vis[v]) {
        mn = 1e9, all = sz[v], rt = -1;
        getsz(v); fa[rt] = u;
        build(rt);
    }
}

练习题

标签:sz,getsz,int,分治,一种,vis,lst,mxsz,写法
From: https://www.cnblogs.com/SkyMaths/p/18528303

相关文章