上午
T1 森林探险
对于每个询问,二分左右端点,剩下的就是线段树的基本操作了
下午
T1 树上操作
首先,真的换根肯定是不可取的,一切操作在原树上进行
LCA的问题,分类讨论,然而情况有点多,比赛时炸了。按题解的说法,取LCA(u,v),LCA(u,p),LCA(v,p)中深度最大的点即可。
Tarjan要离线,倍增不会,所以采用树链剖分求LCA
更改和查询的问题,都是在某点的子树上进行的,设操作点为u,那么用dfn序建线段树,dfn[u]到dfn[u]+u子树大小-1即可代表u的子树。
设当前假根为p,若p不在u的子树内(原树上),u的子树不变;若p与u重合,整棵树为u子树;否则,设v为子树内包含p的u的子结点,原来不在v的子树上的所有点共同组成此时u的子树。此时对整体操作,对v的子树做反操作。
为了找到v,可以直接枚举,但是TLE60pts
怎么办呢?
累死累活打的树链剖分只用来求LCA是不是有点浪费呢?
鉴于CF上有个n=1的毒瘤数据,不建议用vector存边,除非你可以避免使用G.size()