题目链接
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 2767 Solved: 1273
[Submit][Status][Discuss]
Description
一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标。现在地图上有n(N<=10000)个目标,用整数Xi,Yi(其值在[0,5000])表示目标在地图上的位置,每个目标都有一个价值。激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破范围,即那个边长为R的正方形的边必须和x,y轴平行。若目标位于爆破正方形的边上,该目标将不会被摧毁。
Input
输入文件的第一行为正整数n和正整数R,接下来的n行每行有3个正整数,分别表示xi,yi,vi
Output
输出文件仅有一个正整数,表示一颗炸弹最多能炸掉地图上总价值为多少的目标(结果不会超过32767)。
Sample Input
2 1
0 0 1
1 1 1
Sample Output
1
分析:炸弹的范围是边长为R的正方形区域
令a[i][j]表示以(1,1)为左下角,(i,j)为右上角所构成的矩阵的价值和,然后枚举正方形的右上角(i,j)
ans=max(ans,a[i][j]-a[i-R][j]-a[i][j-R]+a[i-R][j-R])
复杂度 O(n^2)
【二维前缀和】
#include <bits/stdc++.h> using namespace std; #define mem(a,n) memset(a,n,sizeof(a)) #define memc(a,b) memcpy(a,b,sizeof(b)) #define rep(i,a,n) for(int i=a;i<n;i++) ///[a,n) #define dec(i,n,a) for(int i=n;i>=a;i--)///[n,a] #define pb push_back #define fi first #define se second #define IO ios::sync_with_stdio(false) #define fre freopen("in.txt","r",stdin) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 typedef long long ll; typedef unsigned long long ull; const double PI=acos(-1.0); const double E=2.718281828459045; const double eps=1e-3; const int INF=0x3f3f3f3f; const int MOD=258280327; const int N=5e3+5; const ll maxn=1e6+5; const int dir[4][2]= {-1,0,1,0,0,-1,0,1}; int a[N][N]; int n,r; int main() { while(~scanf("%d%d",&n,&r)) { mem(a,0); while(n--) { int x,y,w; scanf("%d%d%d",&x,&y,&w); a[x+1][y+1]=w; } rep(i,1,5002) { rep(j,1,5002) { a[i][j]=a[i][j]+a[i-1][j]+a[i][j-1]-a[i-1][j-1]; } } int ans=0; rep(i,r,5002) { rep(j,r,5002) { 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; }