1 条题解
-
0
算法标签
动态规划、树状数组、线段树分治、最长递增子序列(LIS)
问题分析
本题要求选择最大的花集合 ( S ),使得 Ella 和 Bella 必须经过 ( S ) 中所有花,且在该约束下割草量最小。核心是分析路径与割草区域的关系,将问题转化为动态规划与序列优化问题。
关键观察
- 路径与割草区域:Ella 和 Bella 的路径均为从 ((0,0)) 到 ((T,T)) 的右上路径,两人路径形成的“钢丝扫过区域”的面积即为割草量。要最小化该面积,需最大化共同经过的花集合 ( S )(因 ( S ) 越大,路径约束越强,割草量越难增大)。
- 集合 ( S ) 的性质:( S ) 是最长递增子序列(LIS)的变形(花的坐标满足 ( x ) 和 ( y ) 均严格递增),即寻找坐标的最长双递增子序列。
- 动态规划状态:定义 ( g[i] ) 表示以第 ( i ) 朵花为终点的最长双递增子序列对应的最小割草量,最终答案为 ( g[n+1] )(( n+1 ) 对应终点 ((T,T)))。
核心算法思路
1. 最长双递增子序列长度计算
- 通过树状数组维护以 ( y ) 坐标为关键字的最长递增子序列长度,得到每个花的“层数” ( f[i] )(即该花在最长双递增子序列中的位置)。
2. 动态规划状态转移
- 状态定义:( g[i] ) 表示以第 ( i ) 朵花为终点的最小割草量。转移时需考虑所有能转移到 ( i ) 的前驱花 ( j )(满足 ( x_j < x_i ) 且 ( y_j < y_i )),转移方程为 ( g[i] = \min(g[j] + (x_i - x_j)(y_i - y_j)) )。
- 优化转移:利用线段树分治(线段树的区间查询与更新),将前驱花按 ( x ) 排序后,对每个 ( i ) 划分可转移的前驱区间,通过线段树分治快速找到最小的 ( g[j] + (x_i - x_j)(y_i - y_j) )。
3. 结果计算
最终 ( g[n+1] ) 即为经过最长双递增子序列 ( S ) 时的最小割草量。
复杂度分析
- 时间复杂度:)。树状数组计算 LIS 长度为 ),线段树分治处理动态规划转移也为 ),可满足 ) 的数据范围。
- 空间复杂度:),用于存储动态规划数组、树状数组和线段树结构,空间开销可控。
总结
本题通过将最大花集合问题转化为最长双递增子序列问题,结合动态规划与线段树分治优化状态转移,高效求解了最小割草量。核心在于利用序列的单调性和分治思想,将复杂的二维转移转化为可高效处理的区间查询问题,确保了算法的时间效率。
- 1
信息
- ID
- 5196
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者