UOJ #712. 【北大集训2021】简单数据结构

发布时间 2023-04-17 19:06:05作者: 275307894a

题面传送门

很好的题目。

首先我们假设 \(a\) 没有初始值,这貌似是平凡的。因为这样的话如果两个位置 \(x<y\) 那么 \(a_x\leq a_y\) 对于任意时刻都成立。取 \(\min\) 的过程只需要线段树上二分加上区间覆盖即可。

但是有初始值怎么办呢?这个问题开始变得棘手起来。但是我们发现上面那个性质在底下也部分成立:如果某个时刻存在 \(x<y\)\(a_x\leq a_y\) ,那么之后 \(a_x\leq a_y\) 也都成立,因为无论是取 \(\min\) 还是加 \(i\) 都不能改变他们两个之间的大小关系。

假设没有 \(\min\) 操作显然很好维护,那么如果一个位置被取过 \(\min\) 了之后呢?发现所有取过 \(\min\) 的位置都是单调不降的,这就可以像没有初值的时候一样维护。因此,我们如果能求出每个位置第一次被取 \(\min\) 的时间,那么剩下的部分可以用一个线段树解决。

考虑整体二分,对于一个二分区间 \([l,r]\),考虑其左区间是否能对当前区间的数造成影响,要求是 \(a_i+ic_j\geq v_j\),其中 \(c_j\) 表示的是到 \(j\) 为之整体加了多少次。变形可以得到 \(v_j-ic_j\leq a_i\),则可以对点 \((c_j,v_j)\) 构架下凸壳,然后拿斜率位 \(i\) 的直线去截,看最小截距和 \(a\) 的关系即可。时间复杂度 \(O(n\log n)\),但是常数有一点点大。

submission