[HNOI2003]激光炸弹

题目描述

一种新型的激光炸弹,可以摧毁一个边长为 $m$ 的正方形内的所有目标。现在地图上有 $n$ 个目标,用整数 $x_i$ , $y_i$ 表示目标在地图上的位置,每个目标都有一个价值 $v_i$ .激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破范围,即那个边长为 $m$ 的边必须与 $x$ 轴, $y$ 轴平行。若目标位于爆破正方形的边上,该目标不会被摧毁。

现在你的任务是计算一颗炸弹最多能炸掉地图上总价值为多少的目标。

输入格式

输入的第一行为整数 $n$ 和整数 $m$,

接下来的 $n$ 行,每行有 $3$ 个整数 $x, y, v$,表示一个目标的坐标与价值。

输出格式

输出仅有一个正整数,表示一颗炸弹最多能炸掉地图上总价值为多少的目标(结果不会超过 $32767$ )。

样例 #1

样例输入 #1

1
2
3
2 1
0 0 1
1 1 1

样例输出 #1

1
1

提示

数据规模与约定

  • 对于 $100\%$ 的数据,保证 $1 \le n \le 10^4$,$0 \le x_i ,y_i \le 5\times 10^3$,$1 \le m \le 5\times 10^3$,$1 \le v_i < 100$。

题解

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <algorithm>

using namespace std;
const int MAX = 5*1e3+10;
int p[MAX][MAX],ans=-11451400;

int main(){
int n,R;
cin >> n >> R;
while(n--){
int x,y,v;
cin >> x >> y >> v;
p[++x][++y] += v;
}
for(int i=1;i<=5001;i++)
for(int j=1;j<=5001;j++){
p[i][j] += p[i-1][j] + p[i][j-1] - p[i-1][j-1];
}
for(int i=R;i<=5001;i++)
for(int j=R;j<=5001;j++){
ans = max(ans,p[i][j]-p[i-R][j]-p[i][j-R]+p[i-R][j-R]);
}
cout << ans;

return 0;
}
  • 使用了二维数组的前缀和:

    image-20221104231118727

  • 还是要多做题啊,真实。