洛谷P2280 [HNOI2003] 激光炸弹 题解

P2280 [HNOI2003] 激光炸弹 题解

题目

题目传送门

题解

思路

这题是一道标准的二维前缀和模板题。

\(s_{i,j}\)表示数组\(a\)\(a_{1,1}\)\(a_{i,j}\)的矩形内所有数值的和。我们在读入\(x,y,v\)后存起来,随后处理数据到前缀和数组内。

然后就是用二重循环\(m\sim 5001\)枚举右下端点,计算从\((i-m,j-m)\)\((i,j)\)的数值和,计算公式为\(s_{i,j}-s_{i-m,j}-s_{i,j-m}+s_{i-m,j-m}\),用一个答案值\(ans\)每次取最大值,最后输出即可。

代码

#include<bits/stdc++.h>
#define endl '\n'

using namespace std;

const long long INF = 0x3f3f3f3f;
const double EPS = 1e-8;
const long long N = 5005;

int n,m,s[N][N],ans=-1,x,y,v;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>x>>y>>v;
		x++;y++;
		s[x][y]+=v;
	}
	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=m;i<=5001;i++){
		for(int j=m;j<=5001;j++){
			ans=max(ans,s[i][j]-s[i-m][j]-s[i][j-m]+s[i-m][j-m]);
		}
	}
	cout<<ans<<endl;
	return 0;
}
posted @ 2025-02-09 16:17  2789617221guo  阅读(79)  评论(0)    收藏  举报