【UOJ#207】共价大爷游长沙

题目链接

题目描述

火车司机出秦川,跳蚤国王下江南,共价大爷游长沙。每个周末,勤劳的共价大爷都会开车游历长沙市。

长沙市的交通线路可以抽象成为一个 n n n 个点 n − 1 n−1 n1 条边的无向图,点编号为 1 1 1 n n n,任意两点间均存在恰好一条路径,显然两个点之间最多也只会有一条边相连。有一个包含一些点对 ( x , y ) (x,y) (x,y) 的可重集合 S S S,共价大爷的旅行路线是这样确定的:每次他会选择 S S S 中的某一对点 ( x , y ) (x,y) (x,y),并从 x x x 出发沿着唯一路径到达 y y y

小L是共价大爷的脑残粉,为了见到共价大爷的尊容,小L决定守在这张图的某条边上等待共价大爷的到来。为了保证一定能见到他,显然小L必须选择共价大爷一定会经过的边——也就是所有共价大爷可能选择的路径都经过的边。

现在小L想知道,如果他守在某一条边,是否一定能见到共价大爷。

然而长沙市总是不断的施工,也就是说,可能某个时刻某条边会断开,同时这个时刻一定也有某条新边会出现,且任意时刻图都满足任意两点间均存在恰好一条路径的条件。注意断开的边有可能和加入的新边连接着相同的两个端点。共价大爷的兴趣也会不断变化,所以S也会不断加入新点对或者删除原有的点对。当然,小L也有可能在任何时候向你提出守在某一条边是否一定能见到共价大爷的问题。你能回答小L的所有问题吗?

Sol

动态加删边用 L C T LCT LCT
考虑如何处理路径交。
一种方法是直接对链做一次覆盖。交必须满足被覆盖的次数为当前总的 S S S 集合大小
但是这种做法当我们删掉一条链上的边的时候 , 它必须要一个个把贡献去掉并且重新覆盖 , 显然是不行的。
我们要支持能够快速删除与当前边相关的所有路径覆盖操作的方法。
异或操作是支持快速撤销的 , 只需要再次异或一次就行了。
我们每次加入一条路径的时候给他随机一个权值 , 然后用这个权值去覆盖。
删除一条边时 , 我们能够直接知道这条边上的权值的异或和 , 用这个值重新覆盖一次新的路径即可,稍微画一下图就知道这个做法是对的了。这样做就要用 L C T LCT LCT 维护边权,不是那么好写。

另一种做法。
当我们询问一条边 ( u , v ) (u,v) (u,v)的时候 , 如果满足条件 , 必定是所有路径的一端在以 v v v 为根 u u u 的子树里 , 另一端在以 u u u 为根 v v v 的子树里 , 我们只需要判断一边就可以了。
于是还是给每一条路径随机一个权值 ,然后修改端点的权值。
于是只需要查询以 u u u为根 v v v 的子树和是否和全局的一半一致即可。

code:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值