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

1.题意翻译

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

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


2.思路

先考虑不加高。

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

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

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

也就是说这样一个区域

(图随手画的比较草率)

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

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

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

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

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

可以通过线段树维护区间加,全局 $\min f_i - i$ 是否大于 $0$ 即可。


3 代码

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

传送门|我永远喜欢三无

posted @ 2022-08-10 23:29  寂静的海底  阅读(5)  评论(0编辑  收藏  举报  来源