专栏文章

Histogram Sequence

P14630题解参与者 1已保存评论 0

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@mimz253z
此快照首次捕获于
2025/12/01 17:53
3 个月前
此快照最后确认于
2025/12/01 17:53
3 个月前
查看原文
钦定一个区间中最左边的最小值起贡献。容易单调栈求出每个位置 ii 起贡献的区间 [li,ri][l_i,r_i]
先考虑简化版问题,即 L=1L=1。考虑一个归并排序的过程,即先对于一个 ii,把它起贡献的区间的权值从小到大排序,再把 nn 个数组归并。由于 aia_i 固定所以只需要对长度排序。我们对这些长度去重并记录出现次数 cnt\operatorname{cnt}。然后把所有 ii 当前的最小长度放进一个堆维护。每次取出堆顶并输出 cnt\operatorname{cnt} 次当前权值,然后将当前决策弹出堆并加入当前决策的后继决策。
L>1L>1 的时候,考虑先二分找到排名为 LL 的权值 vv,二分时的 check(v) 函数应当能够返回 v\le v 的权值个数,那么我们就知道 vv 需要输出几次。若次数超过 RL+1R-L+1 就直接输出并结束程序。否则对于每个 ii,取出权值大于 vv 的部分进行上面那个归并即可。
现在我们需要知道如何计算一个 ii 有多少个长度 len\le \operatorname{len} 的贡献区间。先考虑长度 =len=\operatorname{len} 的。若不考虑 li,ril_i,r_i 的限制,那么可取的左端点为 [ilen+1,i][i-\operatorname{len}+1,i]。那么加上限制之后左端点的取值区间应当为 [max{ilen+1,li},min{i,rilen+1}][\max\{i-\operatorname{len}+1,l_i\},\min\{i,r_i-\operatorname{len}+1\}]。个数容易计算。接下来还要对这玩意求个前缀和,分类讨论把 min\minmax\max 拆开分段计算即可。
认为 N,RN,R 同阶,时间复杂度 O(NlogN)\mathcal{O}(N\log N),空间复杂度 O(N)\mathcal{O}(N)

评论

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

正在加载评论...