像潮落潮涌,送我奔向自由。|

寂静的海底

园龄:3年2个月粉丝:59关注:15

【题解】CF533A Berland Miners [思维,线段树]

1.题意翻译

现在这个翻译实在是太迷了。

有一个山洞视作由 n 个点组成的树,每个点有高度 hi , k个人从 1 号点出发,你需要给这 k 个人安排终点 , 每个点仅可作为一个人的终点,一个人从起点走到终点路上的所有点需要大于他的身高 si ,你可以给某一个点价高 t ,最小化 t 使得每个人都能走到他的终点,或者判断无解。


2.思路

先考虑不加高。

称根到该点路径上的最小值为这个点的限制。

因为身高高的人能去的点集一定是身高低的人的点的子集,所以考虑按照身高降序后贪心地放到可以的山洞里,显然要求就是第 i 高的人可以去的山洞的个数要大于 i ,每个人可以到的点的个数可以通过差分简单的求出。

考虑把一个点加高到 x,加高一个点 A 对某个点 B 有影响,当且仅当 A1B 路径上的唯一最小值。

也就是说这样一个区域

(图随手画的比较草率)

直到红色区域,就影响不了红色区域和它的子树了。

对于黑色那块区域,他的限制就变成了 min{次小限制,x}

由于每个点对应的“唯一最小值”个数是不超过 1 的,所以我们直接求出每个点的“唯一最小值控制区域”,这些“控制区域”的大小总和是不大于 n 的。

然后一个点从它的“最小限制” ori 变成了 new=min{次小限制,x} , 产生的影响是让 (ori,new] 身高的人多了一个可以去的点。

就是说总共要进行 n 次对一些区间内人 fi+1fi , 并查询是否满足所有的 fii ,其中 fi 表示 i 人可以到达的点数。

可以通过线段树维护区间加,全局 minfii 是否大于 0 即可。


3 代码

篇幅较长,不在此处放出,线段树只需要维护区间加,没有 query , 整体码量也不算大 , 需要记得特判答案为 0 的情况。

传送门|我永远喜欢三无

posted @   寂静的海底  阅读(7)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起