正解:整体二分+树状数组
解题报告:
题目还是大概解释下?虽然其实是看得懂的来着,,,
大概就是说给一棵树.给定一些询问,每个询问都是说在两个点之间的路径上的子路径的第k大是什么
然后看到这种动态区间第k大就要想到整体二分嘛
然后想怎么实现单个询问的二分
显然是二分一个值mid,然后大于mid的路径都可以加入,然后看水果上有几个盘子和k比大小就好昂
所以难点就是在,怎么表示出盘子是水果的子路径,怎么求水果上有几个盘子(其实是一个问题,,,QwQ)
首先可以想到按照一般的套路应该是利用树状数组或者线段树然后加加减减然后查询嘛,只是考虑怎么表示
那就先dfs走一遍,求出dfn和low(这儿的low不是tarjan里那个,,,只是u的子树中的dfn最大值然后我喜欢这么设而已QAQ
然后考虑分类讨论盘子的情况——在一条链(即一个为lca)上或在一棵树上
如果是在一条链上,就很好求嘛,因为要盘子是水果的子路径,所以一定是水果的一端在盘子较深的节点的子树内部,另一端在lca的外部
→转化成dfn和low,设较深的节点叫u另一个叫v,那么就要满足一个在[dfn[u],low[u]]之内,一个不在[dfn[v],low[v]]之内
如果在一棵树上,那就是水果的两端都是在两个节点的子树内部
→转化成dfn和low,就都是在[dfn[],low[]]之内
所以就直接区间修改单点查询,树状数组线段树都可以,over
代码咕了,不知道什么时候会放,随缘趴:D