1 条题解
-
0
题解
问题分析
题目要求模拟合并区间并计算每个区间积水容量的过程。积水容量的计算规则为:
- 对于区间 中的每个位置 ,计算
- 区间容量
关键观察
-
容量公式转换:
其中 ,
-
简化计算:
- 实际上 就是整个区间 的最大值
- 因此 $w = (r-l+1) \times \max_{l \le i \le r} h_i - \sum_{i=l}^r h_i$
算法思路
并查集 + 线段树维护区间最大值和和:
-
数据结构:
- 使用红黑树
tree维护当前所有区间 - 两个线段树
sgtl和sgtr分别维护从左到右和从右到左的"前缀最大值和" - ST 表快速查询区间最大值
- 使用红黑树
-
合并过程:
- 每次合并相邻区间 和
- 更新线段树:将新区间的最大值传播到对应区间
- 计算新区间容量并输出
核心函数说明
-
线段树操作:
upd():区间取最大值操作(类似区间chkmax)query():查询区间和- 维护最小值、次小值等信息来优化区间取最大值操作
-
容量计算:
sgtl.query(lx,ry) + sgtr.query(lx,ry) - len*qry(lx,ry) - sum[ry] + sum[lx-1]这里计算的是修正后的积水容量
算法步骤
- 初始化线段树和ST表
- 对于每个合并指令:
- 找到要合并的两个区间
- 更新线段树中的区间最大值信息
- 计算新区间的积水容量
- 输出结果
复杂度分析
- 预处理: 建ST表和线段树
- 每次合并: 查找区间 + 线段树操作
- 总复杂度:
算法标签
- 线段树
- ST表
- 区间合并
- 红黑树/平衡树
- 数据结构维护
- 离线处理
- 1
信息
- ID
- 3923
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者