模板树链剖分
Posted akakw1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板树链剖分相关的知识,希望对你有一定的参考价值。
使用方法:
- sz(size)储存子树大小
- dp(deep)储存节点深度
- fa(father)储存节点父亲
- hs(heavy son)储存节点重儿子
- hf储存当前节点所在链的顶端节点
- id储存节点编号
- nd(node)储存当前编号对应的节点
namespace tree { #define MAXN 100001 int sz[MAXN], dp[MAXN], fa[MAXN]; int hs[MAXN] = {0}; void dfs1(int x, int f, int dep) { dp[x] = dep, fa[x] = f, sz[x] = 1; int hsz = 0; for(int i = head[x]; i; i = nxt[i]) { if(ver[i] == f)continue; dfs1(ver[i], x, dep + 1); sz[x] += sz[ver[i]]; if(sz[ver[i]] > hsz) { hsz = sz[ver[i]]; hs[x] = ver[i]; } } } int hf[MAXN], id[MAXN], nd[MAXN]; int cnt = 0; void dfs2(int x, int hfa) { hf[x] = hfa, id[x] = ++ cnt, nd[cnt] = x; if(hs[x])dfs2(hs[x], hfa); for(int i = head[x]; i; i = nxt[i]) if(ver[i] != hs[x] && ver[i] != fa[x]) dfs2(ver[i], ver[i]); } #undef MAXN }
储存方法:链式前向星
int head[100001] = {0}, nxt[200001], ver[200001], tot = 0; void add(int x, int y) { ver[++ tot] = y, nxt[tot] = head[x], head[x] = tot; ver[++ tot] = x, nxt[tot] = head[y], head[y] = tot; }
以上是关于模板树链剖分的主要内容,如果未能解决你的问题,请参考以下文章