洛谷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;
}

浙公网安备 33010602011771号