#919. 【UR #28】环环相扣 题解
#919. 【UR #28】环环相扣 题解
取模不好搞,我们先分析性质。
首先可以假设
最优化的题,我们可以先分析一个答案下界/上界,与他们的取等条件,这样往往可以找到许多优秀的性质。
分析答案下界是很简单的,就是竭尽所想的构造一个比较优的方案。
分析答案上界需要一些数学手段,得到一种情况的答案上界,若小于等于先前分析的答案下届,那么这种情况就一定是不可取的。
由于取模很复杂,这里直接不考虑取模都可以得到一个答案下界:
考虑第二种情况,有
根据取模的常见结论:
当
时 。
得到两种情况的上界:
当然对于情况一还有更多的组合,但是形式十分复杂看上去就不怎么好分析。
我们尝试从形式最简单的那几个探究起。
-
对于第一种情况:
-
这说明当 不取最大值就一定使第一种情况答案达不到上界 -
这说明 只能取次大值(因为 是最大值)否则会使答案低于下界 -
太复杂了,有加减乘除还涉及多个变量,似乎并不能分析出什么。
-
-
对于第二种情况:
:这说明若 只能取最大值,否则答案不会更大。- 其他情况同理,太复杂了。
现在根据我们的分析重新整理一下两种情况:
可以发现第二种情况
于是再次整理为:
于是只有
如果已经分析了很多性质了,应该尝试一些算法去解决。(分析不出来任何性质也只能套算法呀QWQ)
我们已经把单次查询的复杂度降到最低了(与输入同级了),那么现在要考虑预处理些什么。
发现我们每次其实是在找
可以预处理这两坨。
设
因为
这提示我们固定这两个值,有一种神奇的方法
设
表示 然后我们用
合并出 。 这种设
并处理 是一种非常实用的方法,在莫队二次离线中也用了类似的思路。
发现我们可以
具体的,设
-
若
则 -
若
则
类似的处理出
复杂度
有了新的做法,根据做法分析新的性质(悲
首先发现如果
我们可以在尝试一下答案上下界:
假设我们已经知道结论后进一步分析,我们一开始假设从每个
感性理解,这样只会减小
如果对于每个元素,其运算次数的限制是不独立的,就考虑势能分析。
所以要用势能分析,得从运算代价的不独立性考虑。
令势能为
用 ST 表预处理区间最大值可以做到
然而在 UOJ 上只有
可以发现刚刚的答案上界还有另一种形式:
这与 80 分做法分析的性质很想啊,因为变一下形就是
考虑如何与刚刚的方法相结合:我想不到,直接引用吧。
- 使用
vector<pair<int, long long>>
存储满足 的位置 ,并记录对应的 。 - 使用一个栈存储尚未被移除的元素。
- 针对
向左扫描的过程中:- 从栈顶到栈底枚举所有元素
。 - 如果
,则计数器cnt++
。 - 如果
,则给 新增一个删除标记。 - 如果
cnt
达到 ,立刻停止扫描。 - 移除累积了两个删除标记的元素。
- 将具有一个或零个删除标记的元素按照原顺序压回栈中。
- 从栈顶到栈底枚举所有元素
- 最后将
以初始零个删除标记压入栈中。
这样保证了被个数计算次数不超过
考虑这种不用额外性质却需要同时结合多个性质的算法设计,需要一气呵成,然后调整。这需要多练习积累正确的方向与感觉。
最后复杂度
作者:lupengheyyds
出处:https://www.cnblogs.com/lupengheyyds/p/18737262
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】