专栏文章
题解:P7011 [CERC2013] Escape
P7011题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minnf3w9
- 此快照首次捕获于
- 2025/12/02 05:15 3 个月前
- 此快照最后确认于
- 2025/12/02 05:15 3 个月前
[CERC2013] Escape
先把 和一个虚点连边,将虚点的权值设为 ,那么只需要判断能得到的最大精力是否为 即可。
注意到一个点是否经过与其子树中的精力有关,所以只能考虑
dp。设 表示到达 点前精力为 ,在 子树中最多能增加多少的精力。转移时暴力合并即可,复杂度极高。
考虑优化。观察到 肯定由一些值相同的连续段构成,而所有的 的连续段数量之和大概是 的,所以考虑用若干个
pair 来表示 。记 表示当初始精力大于等于 时最终的精力可以相较于初始精力小于 增加 。那么最终统计答案时按照 从小到大考虑,如果当前精力大于等于 就把当前精力加上 即可。由于要保证 不降顺序求答案,所以可以用堆维护信息。合并两个子树的时候用启发式合并或者可并堆,重点考虑新增一个点。
假设增加的点为 ,权值为 ,分类讨论权值正负。 时直接将 加入堆中。 时相当于当前子树需要大于等于 的精力才能进入,所以对于 的那些数对要将 加上 。
这样还不够,因为我们的
dp 数组实际上还有一个性质,当前子树内的权值小于 可以不走,对应的 为 。然而用数对维护时不能很好的满足这个性质,所以需要将 的数对和之后的位置进行合并,如果能够使得 就插入,否则此时走该子树一定不优,全部清空即可(实际上只要判断在 的时候放入就行了,因为如果加起来都小于 那么堆一定是空的)。直接用堆维护就可以做到 了,用可并堆可以做到 ,但没必要。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...