「JOI Open 2019」三段跳び
题意:
个数, 次查询,每次给出区间 ,求区间内满足以下条件的三元组 中 的最大值:
-
。
-
。
做法
考虑可能成为答案的 和 组成的二元组 是很少的。事实上,这是 级别的。我们可以考虑这样的 满足的性质:其必然有 ,否则将一个小的位置换成中间的最大值肯定更优。
而这个条件非常舒服,可以直接单调栈求出这些二元组。具体地,维护一个不降的栈,在访问栈顶时(不一定要成功弹栈)把顶端元素与当前元素组成的二元组加入。这样容易发现不会漏掉任何一个合法的二元组。
得到这 个二元组过后怎么快速计算呢?考虑离线下来,按左端点排序,扫描线从右往左扫,不断加入新的二元组,并对某一个后缀进行更新,表示这一个后缀作为 可以与 组合。具体地,令 为 作为 时 的最大值。那么修改操作就是区间的 对一个值取最大值,查询的是区间 的最大值。这个用线段树怎么做呢?
答案很简单!维护某个区间的 和 表示区间内 的最大值与 的最大值,那么当更新的值为 时只需要 即可。自己稍加思考便可想清楚了。
至此,我们用 的时间复杂度解决了这个问题。
本文作者:TulipeNoire
本文链接:https://www.cnblogs.com/TulipeNoire/p/18015206/balabala
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步