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\) 表预处理即可。

浙公网安备 33010602011771号