【算法竞赛进阶指南】前缀和BZOJ1218激光炸弹

题目是二维前缀和,N^2完成维护

S[i,j]=S[i-1,j]+S[i,j-1]+A[i,j],简化操作数据直接输入S中

题目中要注意目标的坐标,往往被包含在x+1,y+1之中

#include<cstdio>
#include<algorithm>
using namespace std;
int f[5005][5005];

int main(){
    int n,R;
    scanf("%d%d",&n,&R);
    int maxx=R,maxy=R;
    while(n--){
        int x,y,v;
        scanf("%d%d%d",&x,&y,&v);
        x++;y++;//注意
        f[x][y]+=v;
        maxx=max(maxx,x);
        maxy=max(maxy,y);
    }
    for(int i=1;i<=maxx;i++){
        for(int j=1;j<=maxy;j++){
            f[i][j]+=f[i-1][j]+f[i][j-1]-f[i-1][j-1];
        }
    }
    int maxans=0;
    for(int i=R;i<=maxx;i++){
        for(int j=R;j<=maxy;j++){
            maxans=max(maxans,f[i][j]-f[i-R][j]-f[i][j-R]+f[i-R][j-R]);
        }
    }
    printf("%d",maxans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/rign/p/10052963.html