泥豪!我是2789617221guo|

2789617221guo

园龄:1个月粉丝:2关注:2

2025-02-09 16:17阅读: 7评论: 0推荐: 0

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

本文作者:2789617221guo

本文链接:https://www.cnblogs.com/2789617221guo/p/18706236

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   2789617221guo  阅读(7)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起