→题目链接←
val[i][j]表示0~第i行,0~第j列所有炸弹价值的和
然后我们暴力枚举所有的正方形左上角那个点
(我是认为左上角为0,0 右下角为5000,5000)
每个正方形的价值可以O(1)算出
简单来说就是二位前缀和
没啦~~
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#define inf 999999999
using namespace std;
int val[5050][5050];
int n,m;
int ans=0;
int main(){
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
val[x][y]+=z;
}
for(int i=1; i<=5000; i++){
val[i][0]+=val[i-1][0];
val[0][i]+=val[0][i-1];
}
for(int i=1; i<=5000; i++){
for(int j=1; j<=5000; j++){
val[i][j]+=val[i-1][j]+val[i][j-1]-val[i-1][j-1];
}
}
for(int i=0; i<=5000-m+1; i++){
for(int j=0; j<=5000-m+1; j++){
int sum=val[i+m-1][j+m-1];
if(j>0)sum-=val[i+m-1][j-1];
if(i>0)sum-=val[i-1][j+m-1];
if(j>0 && i>0)sum+=val[i-1][j-1];
ans=max(ans,sum);
}
}
printf("%d\n",ans);
return 0;
}