1 条题解
-
0
题解
问题分析
我们需要选择最多 个主对角线上的正方形,覆盖所有兴趣点,且覆盖的总格子数最小。
关键观察:
- 每个照片必须是主对角线上的正方形,即从 到 的正方形
- 一个兴趣点 能被照片 覆盖当且仅当:$$a \leq \min(r_i, c_i) \quad \text{且} \quad b \geq \max(r_i, c_i) $$
算法步骤
1. 预处理和简化
- 对每个兴趣点 ,计算:
- 现在每个兴趣点对应一个区间
- 去除被包含的区间:如果 ,则去除
- 将区间按 排序,此时 也是递增的
2. 动态规划状态设计
设 表示覆盖前 个区间,使用 张照片的最小总格子数。
状态转移:
$$dp[i][j] = \min_{0 \leq t < i} \{ dp[t][j-1] + (y_i - x_{t+1} + 1)^2 \} $$其中 表示用一张照片覆盖区间 到 的代价。
3. 动态规划优化
优化1:决策单调性 对于固定的 ,设:
可以证明 具有决策单调性,即最优决策点 是单调不减的。
使用分治优化:
def solve(l, r, opt_l, opt_r): if l > r: return mid = (l + r) // 2 best = INF, -1 for t in range(opt_l, min(opt_r, mid) + 1): cost = dp[t][j-1] + (y_mid - x[t+1] + 1) ** 2 if cost < best[0]: best = cost, t dp[mid][j] = best[0] solve(l, mid-1, opt_l, best[1]) solve(mid+1, r, best[1], opt_r)优化2:边界情况处理
- 当 时,每个区间单独覆盖,答案为
- 当 时,答案为
4. 复杂度分析
- 预处理:
- DP状态数:
- 使用分治优化后,每个 的复杂度:
- 总复杂度:,对于 , 可接受
样例验证
样例1:
n=5, m=7, k=2 点集: (0,3), (4,4), (4,6), (4,5), (4,6)预处理后区间:
- (0,3) → [0,3]
- (4,4) → [4,4]
- (4,6) → [4,6]
- (4,5) → [4,5]
- (4,6) → [4,6]
去除重复和被包含后:
- [0,3], [4,4], [4,5], [4,6]
排序后: [0,3], [4,4], [4,5], [4,6]
最优解:用两张照片覆盖
- 照片1:[0,3],代价
- 照片2:[4,6],代价 总代价: ✓
实现细节
- 去重和简化:使用单调栈去除被包含区间
- 初始化:,其他初始化为无穷大
- 答案计算:
- 注意溢出:使用64位整数存储结果
总结
本题的核心在于:
- 将几何问题转化为区间覆盖问题
- 发现决策单调性并使用分治优化
- 合理处理边界情况和状态初始化
通过巧妙的预处理和动态规划优化,可以在规定时间内求解大规模数据。
- 1
信息
- ID
- 4805
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者