Luogu P2280 激光炸弹 题解报告

mac2022-06-30  114

题目传送门

【题目大意】

 

【思路分析】

 利用二维前缀和,找到最大值,即$$ans=max\{a[i][j]-a[i-R][j]-a[i][j-R]+a[i-R][j-R]\}(1\le i,j<max)$$

【代码实现】

1 #include<iostream> 2 #include<cstdio> 3 #define rg register 4 #define go(i,a,b) for(rg int i=a;i<=b;i++) 5 using namespace std; 6 const int M=5000; 7 int n,R,x,y,z,a[M+2][M+2],ans=0; 8 int main(){ 9 scanf("%d%d",&n,&R); 10 go(i,1,n) scanf("%d%d%d",&x,&y,&z),a[x+1][y+1]+=z;//这里注意处理一下不能覆盖边界 11 go(i,1,M) go(j,1,M) a[i][j]+=a[i-1][j]; 12 go(i,1,M) go(j,1,M) a[i][j]+=a[i][j-1]; 13 go(i,R,M) go(j,R,M) 14 ans=max(ans,a[i][j]+a[i-R][j-R]-a[i-R][j]-a[i][j-R]); 15 cout<<ans; 16 return 0; 17 } 代码戳这里

转载于:https://www.cnblogs.com/THWZF/p/11244699.html

最新回复(0)