其他分享
首页 > 其他分享> > 「JOISC 2022 Day4」鱼 2

「JOISC 2022 Day4」鱼 2

作者:互联网

考虑怎么样的鱼能取得最后的胜利,它一定是不断贪心地往两边吃,能吃就吃。

实现以上过程的一个朴素想法是,对左右两边分别维护”有效“单调栈,暴力扫一遍。

考虑用线段树维护上述过程,思考如何合并区间信息。

假设有 \(x\) 条鱼能在左子树中吃完所有的鱼,那么加入右区间后,它们的增广方向一定是单向的。

这时候发现需要分别维护区间从左和从右开始的“有效”单调栈,也就是维护从左端点或右端点开始吃,在哪些点会停下的栈。

那么就可以快速判断能吃光原区间的鱼能否在新区间依然取得成功。

可以发现栈大小最多为 \(\log_2V\) 个,因为每次跨过障碍后数值至少乘 \(2\)。

还有一种情况是在原区间并不能成功,但是在新区间时通过吃掉另一个区间的一些鱼而取得成功。

首先如果它吃不到另一个区间那么它就永远不可能吃掉全部。

那么只需考虑能吃掉一段前缀或是后缀的位置,把这些都记在它们第一个不能吃到的位置上。可以发现这些位置都在“有效”单调栈上。

接着考虑如何判断能否成为答案。

可以发现能成功的点构成一个前/后缀,那么一个朴素的想法是二分这个位置暴力判断,时间复杂度为 \(\mathcal O(N\log_2 N\log_2V\log\log_2V)\)。

进一步分析可以发现,从小到大枚举若失败则从断点开始继续走,这样合并区间信息的复杂度就是 \(\mathcal O(\log_2V)\)。

总时间复杂度为 \(\mathcal O(N\log_2V\log_2N)\)

标签:2V,log,Day4,JOISC,2022,区间,mathcal,复杂度,单调
来源: https://www.cnblogs.com/Beginner2670/p/16150801.html