专栏文章

雨下整夜

P14528题解参与者 2已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@min3mf07
此快照首次捕获于
2025/12/01 20:01
3 个月前
此快照最后确认于
2025/12/01 20:01
3 个月前
查看原文
楼房重建傻了,现在才知道这个静态问题是可以 1log 的。
给出长度为 nn 的序列 h1,,hnh_1,\dots,h_nqq 次询问 l,r,Hl,r,H,求 i=lrmax{0,min{H,maxj=lihj,maxj=irhj}hi}\sum\limits_{i=l}^r\max\{0,\min\{H,\max_{j=l}^ih_j,\max_{j=i}^rh_j\}-h_i\}。强制在线。
n,q5×105n,q\le 5\times 10^5
先找到区间中最大值的位置 pp,那么 [l,p][l,p] 内的 ii 只需要考虑前缀 max\max[p+1,r][p+1,r] 内的 ii 只需要考虑后缀 max\max。以前缀 max\max 为例。我们要求一个区间 [l,r][l,r] 内的 i=lrmax{0,min{H,maxj=lrhj}hi}\sum\limits_{i=l}^r\max\{0,\min\{H,\max_{j=l}^r h_j\}-h_i\}
可以二分出区间中第一个 >H>H 的位置 xx。再次将问题分为 [l,x1][l,x-1][x,r][x,r] 两部分。
第一部分的贡献为 i=lx1maxj=lihji=lx1hi\sum\limits_{i=l}^{x-1}\max_{j=l}^ih_j-\sum\limits_{i=l}^{x-1}h_i。后者容易前缀和维护。前者是区间前缀 max\max 和,我一开始只会单侧递归,但事实上有一个高妙做法。用单调栈记录每个位置的后继,那么对于一个区间 [l,r][l,r],从 ll 开始不断跳到当前位置的后继,可以得到前缀 max\max 序列。那么就可以暴力计算每种前缀 max\max 的贡献。考虑优化,可以发现除了最后一个前缀 max\max,其余所有前缀 max\max 贡献的范围都是它到后继之间,可以提前预处理出来。那么就是边跳边累计贡献,用倍增优化这个过程即可。最后一个前缀 max\max 再单独算一下即可。
第二部分的贡献为 i=xrmax{0,Hhi}\sum\limits_{i=x}^r\max\{0,H-h_i\}。是一个二维偏序的形式,主席树维护即可。
认为 n,qn,q 同阶,时空复杂度 O(nlogn)\mathcal{O}(n\log n)

评论

2 条评论,欢迎与作者交流。

正在加载评论...