有乙個沿海地區,可以看作有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 31 2 3
2 1 5
4 3 2
21 2 2 3
2 1 3 3
23
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 它擁有...