P13842 篱莘龙

模拟赛T2- P13842 篱莘龙

为什么我没想出来呢?

题意:

给定若干个怪兽的攻击力 \(a_i\) 和 防御力 \(b_i\) 。

如果某只怪兽的攻击力大于另外一只怪兽的防御力,则这只怪兽会去攻击那只怪兽。

对于每个 \(i\) 而言,求在前 \(i\) 个怪兽中选出一些怪兽,使得这些怪兽之间不会互相攻击,求能选出的怪兽的最大数量。

\(1\le n \le 10^6\)

第一步:

用数轴上的线段表示每个怪兽。

但,我被之前做过的题误导了。

我之前做的一道类似的题,我尝试用线段表示过但没有任何效果,所以这次根本没往这方面去想。

具体的,先只考虑 \(a_i<b_i\) 的怪兽(以下简称红色怪兽),我们把它们画在一根数轴上:

发现两只怪兽能够同时选当且仅当两个怪兽对应的区间重叠。我们要需要找到重叠数量最多的地方就行了。

然后再只考虑 \(a_i>b_i\) 的怪兽(以下简称绿色怪兽),发现这种怪兽无论如何也只能选一只。

然后结合起来考虑:

注:红色区间是第一种怪兽,绿色区间为第二种怪兽。

发现蓝色线这里红色有两个区间重叠,而绿色区间此时刚好位于重叠部分之间,此时绿色怪兽和红色怪搜可以同时选,最大的选择数量为 \(3\) 。

第二步:线段树维护

红色最多重叠数的维护是容易的,下面主要讨论如何将绿色的贡献与红色的贡献结合起来。

发现如果一个绿色怪兽的区间被某个红色怪兽的区间端点越过,那么这个绿色怪兽一定不会被统计进答案。

可以试着画图看一下,很容易发现。

那么,我们只需要考虑快速去处理怎么累加绿色怪兽的答案。

我们可以把符合条件的绿色怪兽的出现和消失时间预处理出来。

然后就可以在线段树的叶子节点多存一个数,表示该节点内符合条件的绿色怪兽的数量。

绿色怪兽出现时,就把绿色怪兽的左端点的数量 \(+1\) 。

合并的时候,如果符合条件的绿色怪兽的数量不为 \(0\) 则答案还可以增加 \(1\) 。

这样就成功的维护了当前的答案的最大值。

第三步:处理出现和消失时间

消失时间就是第一次区间内包含红色怪兽区间端点的时候,所以可以对于每一个点处理第一次被红色区间端点覆盖的时候,那一个区间第一次包含红色端点的时候就是区间内的最小值,用 \(st\) 表预处理即可。

posted @ 2026-09-27 08:08  wlhao  阅读(13)  评论(0)    收藏  举报