1 条题解
-
0
问题分析
我们有 个水平的货架(线段),第 个货架在高度 上,左右端点分别为 和 。
关键观察:当打开一个货架的水龙头时,水会从货架两端垂直流下,如果流经下方的其他货架,就会淹没那些货架。
更精确地说:对于货架 ,如果存在货架 满足:
(即货架 在货架 下方)
(即货架 的中点垂直投影落在货架 上)
那么打开货架 的水龙头也会淹没货架 。
关键转化
设 为指示随机变量,表示在随机排列中货架 的水龙头被打开。
对于货架 , 当且仅当在排列中,所有能淹没货架 的货架都在 之后被考虑。
换句话说:设 是能淹没货架 的所有货架集合(即所有满足 且货架 的中点投影落在货架 上的货架 ),那么货架 被打开当且仅当在随机排列中, 出现在 中所有元素之前。
算法实现
现在问题转化为:对于每个货架 ,计算有多少个货架 满足 。
高效计算方法
预处理:对于每个货架 ,计算其中点 。
扫描线:按高度从高到低处理货架(即 从 到 ):
对于当前货架 ,查询区间 内有多少个中点
然后将 加入数据结构
数据结构:使用树状数组或线段树来维护中点位置的计数。
时间复杂度:
- 1
信息
- ID
- 4355
- 时间
- 1500ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者