题解:二维前缀和,枚举正方形右下端点
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int u=5001; int ans; int n,r; int s[u+1][u+1]; int main(){ scanf("%d%d",&n,&r); while(n--){ int x,y,z; scanf("%d%d%d",&x,&y,&z); s[x+1][y+1]+=z; } for(int i=1;i<=u;++i){ for(int j=1;j<=u;++j){ s[i][j]=s[i][j]+s[i][j-1]+s[i-1][j]-s[i-1][j-1]; } } for(int i=r;i<=u;++i){ for(int j=r;j<=u;++j){ int tm=s[i][j]-s[i][j-r]-s[i-r][j]+s[i-r][j-r]; ans=max(ans,tm); } } cout<<ans<<endl; return 0; }