题目链接

https://ac.nowcoder.com/acm/problem/20032

解题思路

有坑点啊:
1.xiyi能取到0;
2.遍历前缀和的范围最小为正方形边长,要不当最大的xi,yi都小于r的时候输出为0。

AC代码

#include<bits/stdc++.h>
#define ll long long

using namespace std;

const int N=5005;
int x,y,n,r,b,xx,yy;
short ans,mp[N][N],v;

short Max(short a,short b)
{
    return a>b?a:b;
}

int main()
{
    cin>>n>>r;
    xx=r,yy=r;//勿忘
    for(int i=1;i<=n;i++) cin>>x>>y>>v,mp[x+1][y+1]=v,xx=max(x+1,xx),yy=max(y+1,yy);//勿忘+1
    for(int i=1;i<=xx;i++)
    for(int j=1;j<=yy;j++)
    {
        mp[i][j]+=mp[i-1][j]+mp[i][j-1]-mp[i-1][j-1];
        if(i>=r && j>=r) ans=Max(ans,mp[i][j]-mp[i-r][j]-mp[i][j-r]+mp[i-r][j-r]);
    }
    cout<<ans<<endl;
}