{{ self.title() }} by 杨宇辰(command_block) ## 题目简述 给出 $h_{1\sim n}$,若水位为 $L$,在平面直角坐标系上标记点 $(i,h_i)$ 和 $(i,2L-h_i)$,共 $2n$ 个点。 对于两个点 $(x_1,y_1),(x_2,y_2)$,若满足 $x_2=x_1+1$ 且 $y_1p_{u+1}>\dots>p_t\ ?\ p_{t+1}<\dots< p_v$。 让 $L$ 从小到大增加,$p$ 之间的不等号会逐个改变,可以用 `std::set` 维护合法的极长 `>>>?<<<` 区间。区间每次变化时(注意,可能有多个不等号同时变化),记下新的区间 $(l_i,r_i)$,使用单调栈求出所有区间的下包络,容易求出子区间总数。 ## 算法4:$O(n\log n)$ 另解 $p_u>p_{u+1}>\dots>p_t\ ?\ p_{t+1}<\dots< p_v$ 可以转化为 $p_u\sim p_v$ 中不存在 $p_{i-1}\leq p_i\geq p_{i+1}$。 考虑水位变化给 $p$ 带来的影响。我们只关心相邻的 $p_i,p_{i+1}$ 的相对大小,不妨设 $h_i>h_{i+1}$,分类讨论可知 - 当 $L<\frac{h_i+h_{i+1}}{2}$ 时,$p_i>p_{i+1}$ - 当 $L>\frac{h_i+h_{i+1}}{2}$ 时, $p_i< p_{i+1}$ - 当 $L=\frac{h_i+h_{i+1}}{2}$ 时,$p_i=p_{i+1}$ 另一种情况类似。 对于每个 $i$,“不存在 $p_{i-1}\leq p_i\geq p_{i+1}$”都对 $L$ 提出一个约束,形如“$L$ 不属于某区间”。 现在问题就转化成,给出 $N=n-1$ 个区间 $I_1,I_2,\dots,I_N$,求有多少对 $l,r$ 满足 $I_l\sim I_r$ 的并不是全集。 考虑用扫描线解决,枚举 $r$,我们要找到所有符合题意的 $l$。 先离散化,每次 $r$ 右移,新加入一个区间 $I_r$,将数组 $o$ 的区间 $I_r$ 赋值为 $r$。这样,数组 $o$ 中的最小值 $x_0$ 就是最薄弱的位置,$l\leq x_0$ 时能覆盖全集,$l>x_0$ 时不能。 (或者用双指针解决)复杂度 $O(n\log n)$​。