一種新型的雷射炸彈,可以摧毀乙個邊長為r的正方形內的所有的目標。現在地圖上有n(n<=10000)個目標,用整數xi,yi(0<=xi,yi<=5000)表示目標在地圖上的位置,每個目標都有乙個價值0第一行為正整數n和正整數r,接下來的n行每行有3個正整數,分別表示xi,yi,vi
僅有乙個正整數,表示一顆炸彈最多能炸掉地圖上總價值為多少的目標(結果不會超過32767)。
2 10 0 1
1 1 1
1
可以建立乙個二維陣列s[i][j],代表從(0,0)到(i,j)的所有價值和。設座標(i,j)價值為a[i][j],則可由畫圖得出a[i][j]=
s[i][j]-s[i-1][j]-s[i][j-1]+s[i-1][j-1]。類似於在陣列中sum[i]-sum[j]可求出j+1到i的和。因此擴充套件到r,則是answer=s[i][j]-
s[i-r][j]-s[i][j-r]+s[i-r][j-r]。
我們先求出s陣列的值,再遍歷一遍得到answer即可。
而細節上,i或j小於r時怎麼辦呢?
剛開始我愚蠢地大量運用三目運算子然後洛谷ac了,入門ojtle了……題解很巧妙,輸入x,y以後x++,y++,再s[x][y],這樣就是從(1,1)開始記錄。這樣第一波求s時,用到的類似s[i-1][j]就不會出現s[-1][j],而是因為全域性變數而直接為s[0][j]=0;而第二次遍歷時直接從(r,r)開始即可,s[r][r]直接就給出了第一塊中的answer。
至於正方形邊上的不算在內這種事情,將i,j,r具體賦值以後畫個圖會發現無礙。
**如下:
#include#include#include#includeusing namespace std;
int mx,my,ans,n,r;
int s[5002][5002];
int main()
{ cin >> n >> r;
mx=my=r;//最大x最大y
for(int i=0; i
bzoj 1218 HNOI2003 雷射炸彈
description 在長為5001的正方形矩陣中,有n個特殊的點,有相應的值。現在用乙個與x,y軸平行的長為r的正方形矩陣套點 不含邊緣 使裡面的特殊點的總值最大。input 輸入檔案的第一行為正整數n和正整數r,接下來的n行每行有3個正整數,分別表示位置與值。output 輸出檔案僅有乙個正整...
bzoj1218 HNOI2003 雷射炸彈
題目傳送門 看到十秒果斷想到暴力,結果一維字首和優化tle了,只好去 了一發二維字首和。花了幾分鐘看了一下,發現其實就是個簡單的容斥原理。以矩陣的右下角作為描述點,預處理出所有的矩陣f i j 表示從 1,1 到 i,j 所有值的和。那麼如圖所示 要求的部分就是紅色部分。設紅色部分右下角的座標為 n...
HNOI2003 BZOJ1218 雷射炸彈
problem 給出n個點,每個點有乙個價值,問乙個邊長為r的正方形最大能覆蓋多大價值。solution 維護二維字首和即可,複雜度o n 2 注意 容易被卡 mle 空間太大,只能比5000大一點。以及字首和開成乙個,不要用兩個陣列。re 空間太小,不要開5001這樣,x y 後會卡點 codes...