1 条题解
-
0
题解
思路
依次处理灯笼。令 表示只决定前 个灯笼的方向后,可以确认已经被照亮的最远位置。尚未被确认照亮的末尾若干灯笼暂时都朝右,它们可以在之后被某个朝左的灯笼照亮。
记
处理第 个灯笼时有两类转移。
第一类令它朝右。如果此前已有 ,说明第 个灯笼已经被照亮,它朝右后可以把最远照亮位置更新为 。也可以暂时不确认它及其右侧贡献,保留 ,等待后面的朝左灯笼收束这一段。
第二类令它朝左。设某个旧状态为 ,并让第 到第 个灯笼全部朝右、第 个灯笼朝左。只要 ,第 个灯笼就能接上此前已经覆盖的前缀,并照亮这一整段的左侧。新状态为
在所有满足 的状态中,最小的 一定最优,因为它包含的朝右灯笼区间最大。记录每次转移的来源即可反向恢复方向字符串。
直接枚举 可以得到平方算法。满分算法需要维护两种查询:
- 按 的值查询所有 中最小的下标 ;
- 查询一段连续灯笼的 最大值。
分别使用维护区间最小值和区间最大值的线段树,就能在对数时间完成一次转移。
做法
初始化 。把每个已经得到的状态 按照键 插入第一棵线段树,叶子保存该键对应的最小状态下标;在后缀区间 查询最小值,即得到第二类转移所需的最小 。
第二棵线段树预先存储所有 ,用于查询 到 的最大右端点。然后依次比较朝左成段转移、已被照亮后朝右转移和暂缓确认转移,保留使 最大的来源。
若最终 ,则所有位置都能被照亮。根据来源数组从 反向恢复:普通转移把当前灯笼设为
R;成段转移把末端设为L,中间灯笼设为R,再跳回旧状态。若 ,则不存在合法方案。上述转移枚举了最后一个朝左灯笼收束未确认后缀的位置,因此不会漏掉任何合法方案;每个得到的状态也对应一份可恢复的合法前缀方案,所以算法同时具有充分性和必要性。
复杂度
设所有数据组的灯笼总数为 。时间复杂度为 ,空间复杂度为 。
- 1
信息
- ID
- 1269
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者