一種新型的激光炸彈,可以摧毀一個邊長爲 R 的正方形內的所有的目標。
現在地圖上有 N 個目標,用整數Xi,Yi表示目標在地圖上的位置,每個目標都有一個價值Wi。
激光炸彈的投放是通過衛星定位的,但其有一個缺點,就是其爆炸範圍,即那個邊長爲 R 的正方形的邊必須和x,y軸平行。
若目標位於爆破正方形的邊上,該目標不會被摧毀。
求一顆炸彈最多能炸掉地圖上總價值爲多少的目標。
輸入格式
第一行輸入正整數 N 和 R ,分別代表地圖上的目標數目和正方形的邊長,數據用空格隔開。
接下來N行,每行輸入一組數據,每組數據包括三個整數Xi,Yi,Wi分別代表目標的x座標,y座標和價值,數據用空格隔開。
輸出格式
輸出一個正整數,代表一顆炸彈最多能炸掉地圖上目標的總價值數目。
數據範圍
0<N≤10000
0≤Xi,Yi≤5000
輸入樣例:
2 1
0 0 1
1 1 1
輸出樣例:
1
。。。這一題一看就差不多知道該怎麼做了,但這題有的卡空間。。。所以只能用一個二維數組(剛開始寫了個沒用的mp二維數組MLE了QAQ)接下來就是一點小小的簡化,它的數據範圍是0到x,對於x或者y爲0的時候需要特判,比較麻煩,我們可以直接在座標上加上1就好了。那麼就不用考慮邊界問題了。還有一個需要注意的點是邊界上的點不能計算,所以計算答案的時候就不需要i-r-1了,直接i-r就好了(i是現在的行,r代表正方形的邊長)
以下是AC代碼:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define IOS ios::sync_with_stdio(false)
const int mac=5e3+10;
const int inf=1e9+10;
int sum[mac][mac];
int main()
{
IOS;
int n,r;
cin>>n>>r;
int mx=-inf,my=-inf;
for (int i=1; i<=n; i++){
int x,y,val;
cin>>x>>y>>val;
sum[x+1][y+1]=val;
mx=max(mx,x+1);my=max(my,y+1);
}
for (int i=1; i<=mx; i++)
for (int j=1; j<=my; j++)
sum[i][j]+=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
int ans=0;
for (int i=1; i<=mx; i++)
for (int j=1; j<=my; j++){
int ii=i-r,jj=j-r;
ii=(ii<0)?0:ii; jj=(jj<0)?0:jj;
int s=sum[i][j]-sum[ii][j]-sum[i][jj]+sum[ii][jj];
ans=max(ans,s);
}
cout<<ans<<endl;
return 0;
}