那么显然,dd的 dfn 序就在u,vu,v之间,且dd是这段区间中深度最浅的那一个 所以,我们之只用求出[dfn[u]+1,dfn[v]][dfn[u]+1,dfn[v]]之间的深度最浅的节点即可,而 LCA 就是这两个节点的父亲 然后就可以使使用 ST 表实现O(nlogn)O(nlogn)预处理,O(1)O(1)查询了 代码如下 #include<bits/...
然后,根据dfndfn序的美妙性质,uu能遍历到vv,肯定往上跑到lcalca至少一次然后选择去了子树vv。所以我们查询[dfnu,dfnv][dfnu,dfnv]区间内deepdeep最小值,就是lcalca儿子。可以理解为,这次走到的,就是lca→vlca→v时链的第一个点。 这是在不同子树的情况,如果在相同子树,也就是说lca=ulca=u,那我们等价...
DFS序实现同理,此处不再赘述。 板子->Luogu P3379 【模板】最近公共祖先(LCA) #include<iostream>#include<cmath>#include<vector>usingnamespacestd;constintlog2n =19; vector<int> edge[500010];intdfn[500010];intst[log2n +1][500010];intcur;#definemin(x, y) (dfn[x] < dfn[y] ? x : y...
很容易想到dfn序里一个区间内颜色相等。思考这颗树,可以想到如果一个新的节点颜色和之前的节点相等的话,那这个节点也必然和这个节点的根节点颜色相等所以每个新的节点它的颜色要么和它的根节点颜色相等,要么和之前所有节点的颜色都不相等。这样考虑最后一个点的问题,很容易想到线性DP。
BZOJ2819 Nim 【dfn序 + lca + 博弈论】 题目 著名游戏设计师vfleaking,最近迷上了Nim。普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取。谁不能取谁输。这个游戏是有必胜策略的。于是vfleaking决定写一个玩Nim游戏的平台来坑玩家。
只不过做着做着,感觉后来的思路(dfn序,线段树,LCA)似乎要喧宾夺主了。。。(至少在代码上看是如此) 思路分析 一个一个操作来(瞎BB中,这种思路模式并不具有普遍性。。。) 1操作 还好我没学树剖233333以至于(直接想到)只好用LCT来维护颜色。 题目透露...