学习了一个新技巧

我居然能从模拟赛中学到新技巧..感动..

大概就是..给你一个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树做树链剖分,好像是个很简单的推广。我是傻逼(

posted @ 2017-04-19 22:19  zball  阅读(202)  评论(0编辑  收藏  举报