题目大意
有一棵\(n\)个点的树,根为1号点,称它为“模板树”。
有一棵初始和模板树相同的树,称它为“当前树”。
对“当前树”有\(m\)次操作,每次操作给出两个数\(x,y\)表示将模板树中\(x\)及其子树复制下来并粘贴到模板树,该子树的根与点\(y\)连边,假设操作前“当前树”有\(a\)个点,“模板树”中\(x\)的子树大小为\(b\),则粘贴上去的\(b\)个点的标号按这棵子树在“模板树”中的标号从小到大的顺序依次标为\(a+1,a+2,...,a+b\)。
\(m\)次操作后,有\(q\)次询问,每次问“当前树”上两点间的距离。
\(n,m,q\leq 10^5;\)
题解
建另一棵树:对于每次操作,粘贴过去的子树的根向点\(y\)所在的树的“根”连边(如果点\(y\)是之前的某一次粘贴过去的点,那么它的“根”是粘贴过去时子树的根,而不是整棵树的根)。
询问两点距离时分类讨论它们是不是同一次粘贴过去的。如果是就直接在模板树上求,如果不是就让它们分别走到和它们同一次粘贴过去的子树的根,再在新树中求LCA。
代码
#include
#include
#include
#include
#include
#include
#include
#include
#include