[HNOI2003]激光炸彈 (二維前綴和)

題目描述
一種新型的激光炸彈,可以摧毀一個邊長爲R的正方形內的所有的目標。
現在地圖上有n(N ≤ 10000)個目標,用整數Xi,Yi(其值在[0,5000])表示目標在地圖上的位置,每個目標都有一個價值。
激光炸彈的投放是通過衛星定位的,但其有一個缺點,就是其爆破範圍,即那個邊長爲R的正方形的邊必須和x,y軸平行。
若目標位於爆破正方形的邊上,該目標將不會被摧毀。
輸入描述:
輸入文件的第一行爲正整數n和正整數R,接下來的n行每行有3個正整數,分別表示 xi,yi ,vi 。
輸出描述:
輸出文件僅有一個正整數,表示一顆炸彈最多能炸掉地圖上總價值爲多少的目標(結果不會超過32767)。
示例1:輸入

2 1
0 0 1
1 1 1

輸出

1

我們可以通過這個圖來理解,二維前綴和其實就是表示矩形的面積,然後求得是紅色區域的面積,那麼拿大的減去兩個小的又多減去了一小塊,最後加上就是所求的面積。

那麼對於本題就是長度爲r的正方形。
在這裏插入圖片描述

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e3 + 7;
const ll mod = 1e9 + 7;

int a[N][N];
int main() {
    int n , r , x, y, v, ans = 0;
    cin>>n>>r;
    for (int i = 0; i < n; ++i) cin>>x>>y>>v, a[x+1][y+1] = v;
    for (int i = 1; i < N; i++)
        for (int j = 1; j < N; j++)
            a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];
    for (int i = r; i < N; i++)
        for (int j = r; j < N; j++)
            ans = max(ans, a[i][j] - a[i][j - r] - a[i - r][j] + a[i - r][j - r]);
    printf("%d",ans);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章