题意:
一种新型的激光炸弹,可以摧毁一个边长为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;
} 
京公网安备 11010502036488号