1. 激光炸弹问题背景与需求分析
激光炸弹问题源自《算法竞赛进阶指南》中的经典例题,它完美展示了前缀和与差分这两个基础算法在实际场景中的高效应用。题目描述的是在一个二维坐标系中,有若干个目标点分布在网格上,每个目标点具有特定的价值。我们需要选择一个边长为R的正方形区域(炸弹爆炸范围),使得该区域内所有目标点的价值总和最大化。
这个问题的现实意义非常直观——假设你是一名军事指挥官,需要在有限的弹药资源下,选择最优的轰炸位置以获得最大战果。或者换个更和平的场景:你是一家广告公司的策划,要在城市地图上选择最佳广告牌位置,使得覆盖区域的潜在客户数量最多。无论哪种场景,核心需求都是:如何在二维平面上快速计算任意矩形区域内的数值总和。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 前缀和算法核心思想解析
2.1 一维前缀和的本质
前缀和算法的核心思想是通过预处理构建一个"积分图",使得后续的区域求和操作可以在常数时间内完成。以一维数组为例:
原始数组:a[0], a[1], a[2], ..., a[n-1]
前缀和数组:s[0]=0, s[1]=a[0], s[2]=a[0]+a[1], ..., s[n]=Σa[0..n-1]
这样,计算区间[i,j]的和就可以转化为s[j+1]-s[i]。这个简单的数学变换将O(n)的求和操作优化为O(1)的查表操作。
关键技巧:前缀和数组通常会将下标+1处理,即s[i]表示前i个元素的和(不包括a[i]本身)。这样边界条件处理会更加统一。
2.2 二维前缀和的扩展应用
将一维前缀和扩展到二维情况,我们需要构建一个二维积分图。定义s[i][j]表示以(0,0)为左上角,(i-1,j-1)为右下角的矩形区域内所有元素的和。
计算任意矩形区域(x1,y1)到(x2,y2)的和时,可以使用容斥原理:
sum = s[x2+1][y2+1] - s[x1][y2+1] - s[x2+1][y1] + s[x1][y1]
这个公式可以形象地理解为:大矩形减去左边和上边的矩形,再加上被重复减去的小矩形。
3. 激光炸弹问题的具体实现
3.1 输入处理与边界条件
首先我们需要处理输入数据。假设输入格式为:
n R
x1 y1 w1
x2 y2 w2
...
xn yn wn
其中n是目标点数量,R是炸弹边长,(xi
