专栏文章

题解:P7011 [CERC2013] Escape

P7011题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minnf3w9
此快照首次捕获于
2025/12/02 05:15
3 个月前
此快照最后确认于
2025/12/02 05:15
3 个月前
查看原文

[CERC2013] Escape

先把 tt 和一个虚点连边,将虚点的权值设为 ++\infty,那么只需要判断能得到的最大精力是否为 ++\infty 即可。
注意到一个点是否经过与其子树中的精力有关,所以只能考虑 dp
fu,if_{u,i} 表示到达 uu 点前精力为 ii,在 uu 子树中最多能增加多少的精力。转移时暴力合并即可,复杂度极高。
考虑优化。观察到 fuf_u 肯定由一些值相同的连续段构成,而所有的 fuf_u 的连续段数量之和大概是 O(n)\operatorname{O}(n) 的,所以考虑用若干个 pair 来表示 ff。记 {x,y}\{x,y\} 表示当初始精力大于等于 xx 时最终的精力可以相较于初始精力小于 xx 增加 yy。那么最终统计答案时按照 xx 从小到大考虑,如果当前精力大于等于 xx 就把当前精力加上 yy 即可。
由于要保证 xx 不降顺序求答案,所以可以用堆维护信息。合并两个子树的时候用启发式合并或者可并堆,重点考虑新增一个点。
假设增加的点为 uu,权值为 aua_u,分类讨论权值正负。au0a_u\geq 0 时直接将 {0,au}\{0,a_u\} 加入堆中。au<0a_u<0 时相当于当前子树需要大于等于 au-a_u 的精力才能进入,所以对于 x<aux<-a_u 的那些数对要将 xx 加上 au-a_u
这样还不够,因为我们的 dp 数组实际上还有一个性质,当前子树内的权值小于 00 可以不走,对应的 ff00。然而用数对维护时不能很好的满足这个性质,所以需要将 y<0y<0 的数对和之后的位置进行合并,如果能够使得 y>0y>0 就插入,否则此时走该子树一定不优,全部清空即可(实际上只要判断在 y>0y>0 的时候放入就行了,因为如果加起来都小于 00 那么堆一定是空的)。
直接用堆维护就可以做到 O(nlog2n)\operatorname{O}(n\log^2n) 了,用可并堆可以做到 O(nlogn)\operatorname{O}(n\log n),但没必要。

评论

0 条评论,欢迎与作者交流。

正在加载评论...