1. 程式人生 > >【演算法競賽進階指南】字首和BZOJ1218鐳射炸彈

【演算法競賽進階指南】字首和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;
}