題目傳送門
看到十秒果斷想到暴力,結果一維字首和優化tle了,只好去%了一發二維字首和。花了幾分鐘看了一下,發現其實就是個簡單的容斥原理。以矩陣的右下角作為描述點,預處理出所有的矩陣f[i][j],表示從(1,1)到(i,j)所有值的和。那麼如圖所示:
要求的部分就是紅色部分。設紅色部分右下角的座標為(n,m),紅色矩陣寬為a,長為b,則答案就是f[n][m]-f[n-a][m]-f[n][m-b]+f[n-a][m-b]。即除了黑色部分以外的矩形,減去兩塊藍色的矩形。結果發現橙色的部分有重複,所以加回來。
自己還是太弱了啊……
description
一種新型的雷射炸彈,可以摧毀乙個邊長為r的正方形內的所有的目標。現在地圖上有n(n<=10000)個目標,用整數xi,yi(其值在[0,5000])表示目標在地圖上的位置,每個目標都有乙個價值。雷射炸彈的投放是通過衛星定位的,但其有乙個缺點,就是其爆破範圍,即那個邊長為r的正方形的邊必須和x,y軸平行。若目標位於爆破正方形的邊上,該目標將不會被摧毀。
input
輸入檔案的第一行為正整數n和正整數r,接下來的n行每行有3個正整數,分別表示
output
輸出檔案僅有乙個正整數,表示一顆炸彈最多能炸掉地圖上總價值為多少的目標(結果不會超過32767)。
sample input
2 1
0 0 1
1 1 1
sample output
1
//製作人:陳保良
#include
#include
#include
using
namespace
std;
int read()
while(ch>='0' && ch<='9')
return x*f;
}int f[5100][5100];
int main()
for(int i=1;i<=5001;i++)for(int j=1;j<=5001;j++)f[i][j]+=f[i][j-1];
for(int i=1;i<=5001;i++)for(int j=1;j<=5001;j++)f[i][j]+=f[i-1][j];
ans=0;
for(int i=r;i<=5001;i++)
for(int j=r;j<=5001;j++)
printf("%d\n",ans);
return
0;}
其實如果會維護二維字首和的話,這道題真的不是一般的水啊…… bzoj 1218 HNOI2003 雷射炸彈
description 在長為5001的正方形矩陣中,有n個特殊的點,有相應的值。現在用乙個與x,y軸平行的長為r的正方形矩陣套點 不含邊緣 使裡面的特殊點的總值最大。input 輸入檔案的第一行為正整數n和正整數r,接下來的n行每行有3個正整數,分別表示位置與值。output 輸出檔案僅有乙個正整...
BZOJ 1218(HNOI2003) 雷射炸彈
一種新型的雷射炸彈,可以摧毀乙個邊長為r的正方形內的所有的目標。現在地圖上有n n 10000 個目標,用整數xi,yi 0 xi,yi 5000 表示目標在地圖上的位置,每個目標都有乙個價值0第一行為正整數n和正整數r,接下來的n行每行有3個正整數,分別表示xi,yi,vi 僅有乙個正整數,表示一...
HNOI2003 BZOJ1218 雷射炸彈
problem 給出n個點,每個點有乙個價值,問乙個邊長為r的正方形最大能覆蓋多大價值。solution 維護二維字首和即可,複雜度o n 2 注意 容易被卡 mle 空間太大,只能比5000大一點。以及字首和開成乙個,不要用兩個陣列。re 空間太小,不要開5001這樣,x y 後會卡點 codes...