二维前缀和

洛谷题解

https://www.luogu.com.cn/problem/solution/P2280

#include<stdio.h>
#include<algorithm>
using namespace std;
int s[5007][5007]={0};
int main()
{

int n,r,x,y,v;
scanf("%d %d",&n,&r);
for(int i=1;i<=n;i++)
{
scanf("%d %d %d",&x,&y,&v);
s[x+1][y+1]=v;//为了防止-1出问题
}
//处理边界
for(int i=2;i<=5005;i++)
{
s[1][i]+=s[1][i-1];
s[i][1]+=s[i-1][1];
}
//二维前缀和
for(int i=2;i<=5005;i++)
{
for(int j=2;j<=5005;j++)
{
s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
}
}
int ans=0;
for(int i=r;i<=5005;i++)
{
for(int j=r;j<=5005;j++)
{
ans=max(ans,s[i][j]-s[i-r][j]-s[i][j-r]+s[i-r][j-r]);
}
}
printf("%d\n",ans);

}

posted @ 2021-05-31 20:30  废柴废柴少女  阅读(38)  评论(0)    收藏  举报