Description
一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标。现在地图上有n个目标,用整数,表示目标在地图上的位置,每个目标都有一个价值。激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破范围,即那个边长为R的正方形的边必须和x,y轴平行。若目标位于爆破正方形的边上,该目标将不会被摧毁。
现在你的任务是计算一颗炸弹最多能炸掉地图上总价值为多少的目标。
Input
输入文件的第一行为正整数n和正整数R,接下来的n行每行有3个正整数,分别表示 xi,yi ,vi 。
Output
输出文件仅有一个正整数,表示一颗炸弹最多能炸掉地图上总价值为多少的目标(结果不会超过32767)。
Sample Input
2 1
0 0 1
1 1 1
0 0 1
1 1 1
Sample Output
1
题解
嗯...我们先想一个$O(N^2)$的暴力...
求出二维前缀和...然后再枚举所有的右上端点...嗯...考虑到$X,Y<=5000$...那么这道题就做完了...
emmmmmm........................
1 //It is made by Awson on 2017.10.8 2 #include <map> 3 #include <set> 4 #include <cmath> 5 #include <ctime> 6 #include <queue> 7 #include <stack> 8 #include <vector> 9 #include <cstdio> 10 #include <string> 11 #include <cstdlib> 12 #include <cstring> 13 #include <iostream> 14 #include <algorithm> 15 #define query QUERY 16 #define LL long long 17 #define Max(a, b) ((a) > (b) ? (a) : (b)) 18 #define Min(a, b) ((a) < (b) ? (a) : (b)) 19 using namespace std; 20 const int N = 5000; 21 void read(int &x) { 22 char ch; bool flag = 0; 23 for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || 1); ch = getchar()); 24 for (x = 0; isdigit(ch); x = (x<<1)+(x<<3)+ch-48, ch = getchar()); 25 x *= 1-2*flag; 26 } 27 28 int n, r, x, y, v; 29 int mp[N+5][N+5]; 30 31 void work() { 32 read(n), read(r); 33 for (int i = 1; i <= n; i++) { 34 read(x), read(y), read(v); 35 mp[x+1][y+1] = v; 36 } 37 for (int i = 1; i <= N+1; i++) 38 for (int j = 1; j <= N+1; j++) 39 mp[i][j] += mp[i][j-1]+mp[i-1][j]-mp[i-1][j-1]; 40 int ans = 0; 41 for (int i = r; i <= N+1; i++) 42 for (int j = r; j <= N+1; j++) 43 ans = Max(ans, mp[i][j]-mp[i-r][j]-mp[i][j-r]+mp[i-r][j-r]); 44 printf("%d\n", ans); 45 } 46 int main() { 47 work(); 48 return 0; 49 }