[HNOI2003]激光炸弹
[HNOI2003]激光炸弹
https://ac.nowcoder.com/acm/problem/20032
题意:
一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标。
现在地图上有n(N ≤ 10000)个目标,用整数Xi,Yi(其值在[0,5000])表示目标在地图上的位置,每个目标都有一个价值。
激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破范围,即那个边长为R的正方形的边必须和x,y轴平行。
若目标位于爆破正方形的边上,该目标将不会被摧毁。
就是找一个边长为R的正方形使得val最大
思路:二维前缀和板子题
1.出于习惯,可以把目标范围改为。
2.维护二维前缀和,表示式为:
3.要价值最大,则正方形的可以取价值的面积最大是。
3.枚举每个正方形,取最大值,取每个正方形价值的表达式为:,其实就是左上角点和右下角点形成正方形的价值。
Code:
#include<bits/stdc++.h> #define js ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) using namespace std; typedef long long ll; const int maxn = 5e3 + 5; int a[maxn][maxn],ans; int main() { js; int n,r,x,y,val; cin>>n>>r; for(int i=1;i<=n;++i) { cin>>x>>y>>val; a[x+1][y+1]=val; } for (int i = 1; i < maxn; ++i) for (int j = 1; j < maxn; ++j) a[i][j]=a[i][j]+a[i - 1][j]+a[i][j - 1]-a[i - 1][j - 1]; for(int i=r;i<maxn;++i) for(int j=r;j<maxn;++j) ans=max(ans,a[i][j]-a[i][j-r]-a[i-r][j]+a[i-r][j-r]); cout<<ans<<"\n"; return 0; }
牛客算法竞赛入门课第一节例题、习题 文章被收录于专栏
为雨巨打call