随笔分类 -  2-1dfs序

摘要:我的做法: 给询问按$deep[v]+d$排序,每次做到某一深度的时候,先给这个深度所有点的值清0,然后直接改v的子树 官方做法比较妙妙: dfs,进入v的时候给$[deep[v],deep[v]+d]+=x$,出来的时候再减回来 日常忘开longlong,这回事变量开了输出没开 阅读全文
posted @ 2018-11-16 08:38 Ressed 阅读(287) 评论(0) 推荐(0)
摘要:我们发现,这个染色的操作他就很像LCT中access的操作(为什么??),然后就自然而然地想到,其实一个某条路径上的颜色数量,就是我们做一个只有access操作的LCT,这条路径经过的splay的数量 然后考虑怎么样来维护这个数量。access的过程中,有实边变虚边、虚边变实边的操作,对应过来,实边 阅读全文
posted @ 2018-10-19 14:56 Ressed 阅读(287) 评论(0) 推荐(0)
摘要:一定是从随便某个点开始,然后按着dfs序的顺序跑一圈是最好的 所以说,新加一个点x,就减少了dis(pre,next),增加了dis(pre,x),dis(x,nxt) 删掉一个点同理 这个可以用set维护 阅读全文
posted @ 2018-10-18 17:02 Ressed 阅读(199) 评论(0) 推荐(0)
摘要:首先可以求出从某点做$2^k$次车能到的最浅的点,这个只要dfs一下,把它的孩子能到的最浅的点更新过来就可以 然后倍增地往上跳,不能跳到lca的上面,记录坐车的次数ans 此时有三种情况(设最远能跳到x,y): 1.再跳也跳不到lca的上面,就是-1 2.路径(x,y)被某趟车覆盖,答案是ans+1 阅读全文
posted @ 2018-10-18 16:47 Ressed 阅读(823) 评论(0) 推荐(0)
摘要:dfs序后用线段树来记每个节点的前缀和 每次找一个前缀和最大的节点,然后把它到根的路径上的每个之前没被走过的点 对应的dfs序的区间 减掉那个点的权值 每个点最多被减一次,复杂度是$O(nlogn)$的 阅读全文
posted @ 2018-10-09 10:32 Ressed 阅读(214) 评论(0) 推荐(0)
摘要:先二分出一个时间,把每个军队倍增往上跳到不能再跳 然后如果它能到1号点,就记下来它跳到1号点后剩余的时间;如果不能,就让它就地扎根,记一记它覆盖了哪些叶节点(我在这里用了dfs序+差分,其实直接dfs就行..) 然后对于那些叶节点没有被覆盖完全的(父亲为1号点的)子树,肯定需要一些已经到1号点的军队 阅读全文
posted @ 2018-10-01 20:09 Ressed 阅读(162) 评论(0) 推荐(0)
摘要:把一条路径拆成到根的四个链(两端点、lca和fa[lca]),然后给dfs序中链的端点做单点修改、区间查询它的子树和再加上它原来的权值就可以了 阅读全文
posted @ 2018-10-01 19:47 Ressed 阅读(189) 评论(0) 推荐(0)
摘要:https://www.nowcoder.com/acm/contest/172/C (sbw大佬太强啦 orz) 先把每一个路径(x,y)分成(x,lca),(y,lca)两个路径,然后就能发现,对于某两个(直上直下的)路径a,b,b的下端点在a的下端点子树中,且b的上端点深度<=a的上端点深度, 阅读全文
posted @ 2018-09-11 16:37 Ressed 阅读(223) 评论(0) 推荐(0)