这题拿到手后,一直在纠结[5000][5000]的二维数组能不能开,后来算了下500050004=1e8B=100MB<512MB,所以是可以的。但还是不知道该怎么做,一点思路都没有╮(╯▽╰)╭
没办法只能看题解,采用前缀和的思想,考虑二维前缀和来求解。
参考这张图来理解下面的Code:
using namespace std;
#include<bits/stdc++.h>
int mp[5005][5005];
int main(){
int n,r;
cin>>n>>r;
int xx=r,yy=r;//边界
for(int i=0;i<n;i++)
{
int x,y,v;
cin>>x>>y>>v;
mp[++x][++y]=v;
xx=max(x,xx);
yy=max(y,yy);
}
for(int i=1;i<=xx;i++)
{
for(int j=1;j<=yy;j++)
{
mp[i][j]=mp[i][j]+mp[i][j-1]+mp[i-1][j]-mp[i-1][j-1];//求前缀和
}
}
int ans=0;
for(int i=r;i<=xx;i++)
{
for(int j=r;j<=yy;j++)
{
ans=max(ans,mp[i][j]-mp[i][j-r]-mp[i-r][j]+mp[i-r][j-r]);//求最大值
}
}
cout<<ans;
return 0;
}