【题解】CF533A Berland Miners [思维,线段树]
1.题意翻译
现在这个翻译实在是太迷了。
有一个山洞视作由 个点组成的树,每个点有高度 , 个人从 号点出发,你需要给这 个人安排终点 , 每个点仅可作为一个人的终点,一个人从起点走到终点路上的所有点需要大于他的身高 ,你可以给某一个点价高 ,最小化 使得每个人都能走到他的终点,或者判断无解。
2.思路
先考虑不加高。
称根到该点路径上的最小值为这个点的限制。
因为身高高的人能去的点集一定是身高低的人的点的子集,所以考虑按照身高降序后贪心地放到可以的山洞里,显然要求就是第 高的人可以去的山洞的个数要大于 ,每个人可以到的点的个数可以通过差分简单的求出。
考虑把一个点加高到 ,加高一个点 对某个点 有影响,当且仅当 是 路径上的唯一最小值。
也就是说这样一个区域
(图随手画的比较草率)
直到红色区域,就影响不了红色区域和它的子树了。
对于黑色那块区域,他的限制就变成了 。
由于每个点对应的“唯一最小值”个数是不超过 1 的,所以我们直接求出每个点的“唯一最小值控制区域”,这些“控制区域”的大小总和是不大于 的。
然后一个点从它的“最小限制” 变成了 , 产生的影响是让 身高的人多了一个可以去的点。
就是说总共要进行 次对一些区间内人 , 并查询是否满足所有的 ,其中 表示 人可以到达的点数。
可以通过线段树维护区间加,全局 是否大于 即可。
3 代码
篇幅较长,不在此处放出,线段树只需要维护区间加,没有 query , 整体码量也不算大 , 需要记得特判答案为 0 的情况。
本文已经结束了。本文作者:ღꦿ࿐(DeepSea),转载请注明原文链接:https://www.cnblogs.com/Dreamerkk/p/17970986,谢谢你的阅读或转载!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步