1. 程式人生 > >鐳射炸彈(求一個邊長為r的子矩陣內值的最大(不包括邊界))

鐳射炸彈(求一個邊長為r的子矩陣內值的最大(不包括邊界))

問題 F: 鐳射炸彈

時間限制: 1 Sec  記憶體限制: 128 MB

題目描述

一種新型的鐳射炸彈,可以摧毀一個邊長為R的正方形內的所有的目標。現在地圖上有n(n≤10000)個目標,用整數xi,yi(0≤xi,yi≤5000)表示目標在地圖上的位置,每個目標都有一個價值0<vi<100。鐳射炸彈的投放是通過衛星定位的,但其有一個缺點,就是其爆破範圍,即那個邊長為R的正方形的邊必須和x,y軸平行。若目標位於爆破正方形的邊上,該目標將不會被摧毀。

現在你的任務是計算一顆炸彈最多能炸掉地圖上總價值為多少的目標。

 

 

輸入

第一行為正整數n和正整數R,接下來的n行每行有3個正整數,分別表示xi,yi,vi。

 

輸出

僅有一個正整數,表示一顆炸彈最多能炸掉地圖上總價值為多少的目標(結果不會超過32767)。

 

樣例輸入

2 1
0 0 1
1 1 1

樣例輸出

1
/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>

typedef long long LL;
using namespace std;

int n, r;
int a[5005][5005];

int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);

	scanf("%d %d", &n, &r);
	int x, y, w;
	for (int i = 1; i <= n; i++){
		scanf("%d %d %d", &x, &y, &w);
		a[x + 1][y + 1] += w;
	}
	for (int i = 1; i <= 5001; i++){
		for (int j = 1; j <= 5001; j++){
			a[i][j] += a[i - 1][j];
		}
	}
	for (int i = 1; i <= 5001; i++){
		for (int j = 1; j <= 5001; j++){
			a[i][j] += a[i][j - 1];
		}
	}
	int ans = -1;
	for (int i = r; i <= 5001; i++){
		for (int j = r; j <= 5001; j++){
			ans = max(ans, a[i][j] - a[i - r][j] - a[i][j - r] + a[i - r][j - r]);
		}
	}
	printf("%d\n", ans);

	return 0;
}
/**/