海嘯 矩陣字首和

2022-01-12 21:26:56 字數 1789 閱讀 6980

有乙個沿海地區,可以看作有n行m列的城市,第i行第j列的城市海拔為h[i][j]。

由於沿海,所以這個地區經常會發生海嘯。

海嘯發生時,部分城市會被淹沒,具體來說,海水高度會達到d,因此海拔低於d的城市都會被淹沒。

現在有q次詢問,每次問你乙個矩形區域中,有多少城市不會被淹沒。

第一行三個整數n,m,d,具體含義見題目描述。

接下來n行,每行m個整數,其中第i行第j列的整數為h[i][j],具體含義見題目描述。

第n+2行乙個整數q,表示詢問數。

接下來q行,每行四個整數a,b,x,y,

表示詢問從第a行第b列到第x行第y列的矩形地區中,有多少地區不會被淹沒。

即有多少個i,j,滿足 a≤i

≤x,b

≤j≤y

'>a≤i≤x,b≤j≤ya≤i≤x,b≤j≤y ,且 h[i

][j]

≥d'>h[i][j]≥dh[i][j]≥d 。

共q行,第i行乙個整數,表示第i個詢問的答案。
示例1

3 3 3

1 2 3

2 1 5

4 3 2

21 2 2 3

2 1 3 3

2

3

1≤n

×m≤10

6'>1≤n×m≤1061≤n×m≤1061≤

q≤105

'>1≤q≤1051≤q≤1050≤

d,h[

i][j

]≤109

'>0≤d,h[i][j]≤1090≤d,h[i][j]≤1091≤

a≤x≤

n,1≤

b≤y≤

m'>1≤a≤x≤n,1≤b≤y≤m

分析:1.只給出矩陣n*m<=1e6,行列大小不定,可以用鄰接表解決

2.詢問數量過大,不可能暴力,可以用字首和解決

3.第a行第b列到第x行第y列的矩形地區中,有多少地區不會被淹沒,這是個坑,字首和需要表示成矩陣形狀的字首和

4.邊界情況需要考慮,防止陣列越界

顯然:ans=vec[x][y]+vec[a-1][b-1]-vec[x][b-1]-vec[a-1][y];

#include#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace

std;

#define ll long long

intn,m,d,h,q,a,b,x,y;

intmain()

else

vec[i].push_back(num+vec[i-1][j]);///

每一行當前的沒有被淹數 + 上一行該列的矩陣和,形成矩陣字首和

} }

scanf("%d

",&q);

while(q--)

return0;

}

01矩陣字首和

題目描述 給定乙個 n m 的 01 矩陣,求包含 l,r 個 1的子矩形個數。第一行,兩個正整數 n,m。接下來 n行每乙個長度為 m的 01 串,表示給定的矩陣。接下來 一行,兩個自然數 l,r。首先暴力列舉顯然不可取 注意到,n非常小,可以考慮一種 o n 2m 的方法 很套路,要將詢問拆成 ...

最大化(矩陣字首和)

矩陣字首和 神奇的剪枝 矩陣字首和 如圖,a 2 2 的字首和就是2 3 2 7,a 1 4 的字首和就是2 3 4 8 以此類推,每乙個座標的字首和,都是該座標到矩陣左上角的數字之和 這樣,任意子矩陣的數字和,可以在o 1 時間內查詢 實現 for int i 1 i n i for int j ...

最大子矩陣 字首和 貪心

給定乙個包含整數的二維矩陣,子矩形是位於整個陣列內的任何大小為1 1或更大的連續子陣列。矩形的總和是該矩形中所有元素的總和。在這個問題中,具有最大和的子矩形被稱為最大子矩形。例如,下列陣列 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 其最大子矩形為 9 2 4 1 1 8 它擁有...