题意:给你一棵树,每次询问给出$m$个关键点,树上的一个点受到离其最近的关键点(如有一样近则取编号最小)控制。求每个关键点控制多少个点。
本来虚树题只想写一篇博客的,但是这道题有点毒瘤所以又写一篇吧。
首先,把虚树建出来。
接着dp两遍,找出离每个虚树点最近的关键点(虚树点不一定为关键点,这一点应该都清楚)。
然后对于虚树上的每一条边(对应原树的一条链),找出控制的分界点,即对于边$(u, v)$,找到原树中链$(u, v)$上的点哪些受离$u$近的关键点控制,哪些受离$v$近的关键点控制。这个需要二分一下。
倍增跳到分界点,则链上分界点以下的点及其另外子树都受离$v$近的关键点控制,以上的点及其另外子树都受离$u$近的关键点控制。将答案加上这些点及子树的size总和。
此外就是虚树上的点的另外子树,由于可能会被不同的边计算多次,所以就处理好一起更新即可。
这道题细节很多,计算”另外子树”size的部分需要好好想想,在原来树的size的基础上做一些调整,才能得到想要的答案。
另外一点就是,虚树中弹栈的地方的一个判断是大于等于而不是大于。这个细节非常重要,但又非常容易忽略。