[HNOI2003] 激光炸弹
题目描述
一种新型的激光炸弹,可以摧毁一个边长为 m m m 的正方形内的所有目标。现在地图上有 n n n 个目标,用整数 x i x_i xi , y i y_i yi 表示目标在地图上的位置,每个目标都有一个价值 v i v_i vi。激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破范围,即那个边长为 m m m 的边必须与 x x x 轴, y y y 轴平行。若目标位于爆破正方形的边上,该目标不会被摧毁。
现在你的任务是计算一颗炸弹最多能炸掉地图上总价值为多少的目标。
可能存在多个目标在同一位置上的情况。
输入格式
输入的第一行为整数 n n n 和整数 m m m;
接下来的 n n n 行,每行有 3 3 3 个整数 x , y , v x, y, v x,y,v,表示一个目标的坐标与价值。
输出格式
输出仅有一个正整数,表示一颗炸弹最多能炸掉地图上总价值为多少的目标(结果不会超过 32767 32767 32767 )。
样例 #1
样例输入 #1
2 1
0 0 1
1 1 1
样例输出 #1
1
提示
数据规模与约定
- 对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 1 0 4 1 \le n \le 10^4 1≤n≤104, 0 ≤ x i , y i ≤ 5 × 1 0 3 0 \le x_i ,y_i \le 5\times 10^3 0≤xi,yi≤5×103, 1 ≤ m ≤ 5 × 1 0 3 1 \le m \le 5\times 10^3 1≤m≤5×103, 1 ≤ v i < 100 1 \le v_i < 100 1≤vi<100。
AC代码:
#include<map>
#include<set>
#include<stack>
#include<cmath>
#include<queue>
#include<string>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<numeric>
#include<iomanip>
#define endl '\n'
//#define x first
//#define y second
using namespace std;typedef long long ll;
typedef pair<int, int>PII;
//const int N=3e5+10;
const int MOD=1e9 + 7;
const int INF=0X3F3F3F3F;
const int dx[]={-1,1,0,0,-1,-1,+1,+1};
const int dy[]={0,0,-1,1,-1,+1,-1,+1};
const int M = 1e6 + 10;int n, r;
int g[5010][5010];
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n >> r;r = min(5001, r);for(int i = 1; i <= n; i ++){int x, y, z;cin >> x >> y >> z;x ++ , y ++;g[x][y] += z;}for(int i = 1; i <= 5001; i ++){for(int j = 1; j <= 5001; j ++){g[i][j] += g[i - 1][j] + g[i][j - 1] - g[i - 1][j - 1];}}int res = 0;for(int i = r; i <= 5001; i ++){for(int j = r; j <= 5001; j ++){res = max(res, g[i][j] - g[i - r][j] - g[i][j - r] + g[i -r][j -r]);}}cout << res << endl;return 0;
}