1. 程式人生 > >牛客寒假算法基礎集訓營6 E 海嘯

牛客寒假算法基礎集訓營6 E 海嘯

描述 scan 題目 代碼 XML tex char blank clip

鏈接:https://ac.nowcoder.com/acm/contest/332/E
來源:牛客網

有一個沿海地區,可以看作有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,滿足 aix,bjya≤i≤x,b≤j≤y ,且 h[i][j]dh[i][j]≥d 。

輸出描述:

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

輸入

復制
3 3 3
1 2 3
2 1 5
4 3 2
2
1 2 2 3
2 1 3 3

輸出

復制
2
3


記得之前見過類似的 以為是 二維線段樹
看了題解 是前綴和。。

首先 明白如何求 (a,b) (x,y) 矩陣的和
容斥定理
技術分享圖片

可以看出 求 (a,b)~(x,y)的和 = sum(x,y)-sum(x,b-1)-sum(a-1,y)+sum(a-1,b-1)

其中 sum(s,t) 為 (1,1)~(s,t)的和
也即 結果 = 總矩陣 - 綠矩陣 - 黃矩陣 + 紅色區域


那麽如何利用 前綴和 求 sum呢

具體見代碼 ,結合二維數陣 理解

 1 #include<stdio.h>
 2 const int maxn=2000010;//2倍大小
 3 int n,m,d;
 4 int h[maxn],sum[maxn];
 5 
 6 int main() {
 7     scanf("%d%d%d",&n,&m,&d);
 8     int t;
 9     for(int i=1;i<=n;i++) 
10 for(int j=1;j<=m;j++) { 11 scanf("%d",&t); 12 h[i*(m+1)+j]=t>=d?1:0; 13 sum[i*(m+1)+j]=sum[i*(m+1)+j-1]+sum[(i-1)*(m+1)+j]-sum[(i-1)*(m+1)+j-1]+h[i*(m+1)+j]; 14 } 15 int ans,q,a,b,x,y; 16 scanf("%d",&q); 17 while(q--) { 18 ans=0; 19 scanf("%d%d%d%d",&a,&b,&x,&y); 20 ans=sum[x*(m+1)+y]-sum[(a-1)*(m+1)+y]-sum[x*(m+1)+b-1]+sum[(a-1)*(m+1)+b-1]; 21 printf("%d\n",ans); 22 } 23 return 0; 24 }





牛客寒假算法基礎集訓營6 E 海嘯