题解 P5294 【[HNOI2019]序列】
zhongyuwei · · 题解
参考资料
- IOI2018 集训队论文 高睿泉 《浅谈保序回归问题》
- 大米饼的博客
Sol
部分分:m=0
考虑一个更加一般的形式:已知
定义一个点集
引理 1
能达到最优解的
证明:将
引理 2
如果
证明:参考 IOI2018 集训队论文《浅谈保序回归问题》
引理 2 启发我们可以考虑这样的一个过程:每一次找到一个满足
由引理 1 可知,无论以任何顺序合并,最终得到的
正解
把询问离线下来依次处理。对于询问
最终的划分方案一定是:保留
考虑如何求出
-
lv(L_0) < v(L_0,R_0) < rv(R_0) -
考虑这样一个算法:从大到小枚举
- 对于某个固定的
R_0 来说- 考虑某个比求出的
L_0 更小的L_0' :v(L_0',R_0) 一定合并了不能合并的段(即满足A_i < A_{i+1} 的两个段) - 考虑某个比求出的
L_0 更大的L_0' :v(L_0',R_0) 一定还能和左边的段合并,所以不可能和R_0 一起作为最终的等值段
- 考虑某个比求出的
- 故而,对于固定的
R_0 来说,最大的满足lv(L_0) < v(L_0, R_0) 的L_0 是唯一可能使(L_0,R_0) 合法的L_0
假设
所以,算法结束时求出来的
算法的优化:
- 在已知
R_0 的情况下求最大的满足lv(L_0) < v(L_0, R_0) 的L_0 - 可以证明,如果
L_0 满足条件,那么L_0 - 1 也满足条件 - 由于
lv(L_0) < v (L_0, R_0) ,又因为lv(L_0 - 1) < lv(L_0) ,所以lv(L_0 - 1) < v(L_0, R_0) ,那么lv(L_0 - 1) 一定小于lv(L_0), v(L_0,R_0) 中的元素的平均值(也就是v(L_0 - 1,R_0) ),所以L_0 - 1 一定也满足条件 - 所以可以直接二分
L_0
- 可以证明,如果
- 求最大的
R_0 ,使得满足lv(L_0) < v(L_0, R_0) 的最大的L_0 也满足v(L_0, R_0) < rv(R_0) - 一个重要的观察是,对于某个固定的
R_0 ,满足lv(L_0) < v(L_0, R_0) 的最大的L_0 ,就是使v(L_0,R_0) 取到最大值的L_0 - 可以证明,如果
R_0 满足条件,那么R_0-1 也满足条件 - 设
R_0 求出的L_0 为L ,R_0 - 1 求出的L 为L' ,那么v(L', R_0) \le v(L, R_0) < rv(R_0) < rv(R_0 - 1) ,v(L',R_0) 和rv(R_0) 都小于rv(R_0 - 1) ,所以v(L', R_0 - 1) 小于rv(R_0 - 1) - 所以可以直接二分
R_0
- 一个重要的观察是,对于某个固定的
总时间复杂度为
Code
my submission on loj.ac