我居然能从模拟赛中学到新技巧..感动..
大概就是..给你一个DAG..你可以用这个技巧快速维护它出去的路径,给定方式是字典序第p大..然后这个p有一个bound..比如10^18..
首先树的维护比图容易到不知道哪里去了..
我们考虑设F[p]=1+sum(F[son[p]])即它出去的路径条数..
对于一个点,我们考虑查询它的第K大出路径,那么我们对它的儿子按字典序for一遍,直到找到这个路径的下一个节点..很显然对吧..复杂度是O(n)的..
要优化这个东西我们考虑找出它F最大的儿子..这样其它儿子上的F都小于父亲的一半..那么走这些边只需要log(bound)次对吧很好..
对于那个最大的儿子我们就倍增..
然后考虑这个东西建出来是一个森林..
然后我们就可以愉快的把树上能做的东西搬到DAG上啦..虽然有些限制..而且树也不能动起来..
然后这个东西本身有log^2的复杂度..然后会把一条路径剖成log段..
你套个树剖上去就轻易log^3了对吧..
但是考虑这个东西和树剖那么像,常数还是不太大的..
你在这上面搞第k大带修改..就log^4了吧..(有理有据!逃)
(这个东西(log)套树剖(log)套BIT(log)套可持久化线段树(log))
不过如果仅仅是第k大那不需要树剖,复杂度是log^2..
upd.. revised.. 这个东西其实就是对DAG的dfs树做树链剖分,好像是个很简单的推广。我是傻逼(