题目链接
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;
}