激光炸彈--AcWing99(簡單前綴和)

一種新型的激光炸彈,可以摧毀一個邊長爲 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;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章