码迷,mamicode.com
首页 > 其他好文 > 详细

jzoj5679

时间:2020-05-29 17:36:45      阅读:352      评论:0      收藏:0      [点我收藏+]

标签:行操作   地方   方便   row   标记   多个   包括   选择   class   

题意

给定一棵树,及\(s,t\),A,B玩游戏,A初始在\(s\)不想去\(t\),B想A去\(t\)
A每次在一个点,会选择沿着一条边走过去,走完之后这条边被打上了一个标记,A不能再走了;若A当前所在点的边全部被打上了标记,那就不能动了。
B每次可以选择消除一条边的标记或永久删除一条边。
B先手,花费为执行操作的次数。求B最少的花费使得A到达\(t\)点。

做法

先考虑一种简单情况,若\(s,t\)之间有直接连边
为直观考虑,重新构图,令\(t\)为根,除\(s\)子树其他全部删掉,现在的情况就是\(t\)下仅剩一棵子树\(s\)
假设B不执行操作
A每次往下面逃,最后若在\(u\)点时自己将自己赌死了,这个时候A不能动,B可以任意操作
B的操作就会保留\(u\longrightarrow t\)这条路径上,断开与外界的连边。然后将\(u\longrightarrow t\)上的标记移除,则A行走路径唯一

若不断开与外界的连边,往回走的时候进去了外界,之后还需要格外花费移除标记,所以不会变劣

\(w_u\)为当\(u\)为叶子节点上述花费
现在考虑A往下逃的过程中,B花费一些使答案更优,为方便计算答案,用类似归纳的方法,即计算非叶子节点\(u\)的最优答案\(w_u\),之前\(v\in son_u\)已经被计算出来了
显然是切断一个通往最大答案的地方,若有多个则不切断(其实这里不切断也可以选择切断,否则回来的时候还是得切)

现在考虑一般情况,即\(s,t\)间还有其他节点\(s,x_1,x_2,...,x_{k-1},x_k,t\)
同样按照上述方法计算出\(w_u\)(即到达当前节点\(u\)后到达\(t\)之后的最小花费)
然后这个时候发现从\(s\)走会比较难选择
那我们二分答案\(mid\),然后先考虑\(s\)的子树(不包括\(x_1\)),若往某子树走会不满足\(mid\),则切断边,若有多个则不合法
切完后若没有子树不满足了。那\(A\)\(x_1\)走,再看是否有不满足,这里要考虑若之前\(s\)没切过边,则\(x_1\)有两次的切边机会,后面的同理

jzoj5679

标签:行操作   地方   方便   row   标记   多个   包括   选择   class   

原文地址:https://www.cnblogs.com/Grice/p/12988509.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!