Prob.3[二维前缀和+暴力] 洛谷2280HNOI2003激光炸弹 Upd:2020.3.1

1.前缀和S=∑(i=1 to n) ai

2.二维前缀和S[i][j]=S[i-1][j]+s[i][j-1]-S[i-1][j-1]+A[i][j];

求矩形(L,R)内的数之和,设右上角坐标为(x,y) Sum=S[x][y]-S[x-L][y]-S[x][y-R]+S[x-L][y-R];

对于这个图,我们只需要O(n^2)预处理出所有的二维前缀和,然后O(n^2)枚举出每一个正方形的右上角,记录数值即可。

AC Code:

#include<cstdio>
using namespace std;
int s[5002][5002],n,R,x,y,z,Ans;
inline int max(int x,int y)
{
return x>y?x:y;
}
int main()
{
scanf("%d%d",&n,&R);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&x,&y,&z);
s[x+1][y+1]=z;
}
for(int i=1;i<=5001;i++)
for(int j=1;j<=5001;j++)
s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
for(int i=R;i<=5001;i++)
for(int j=R;j<=5001;j++)
Ans=max(Ans,s[i][j]-s[i-R][j]-s[i][j-R]+s[i-R][j-R]);
printf("%d",Ans);
return 0;
}

猜你喜欢

转载自www.cnblogs.com/little-cute-hjr/p/12391287.html