牛客寒假算法基礎集訓營6 E 海嘯
阿新 • • 發佈:2019-02-09
描述 scan 題目 代碼 XML tex char blank clip
由於沿海,所以這個地區經常會發生海嘯。
海嘯發生時,部分城市會被淹沒,具體來說,海水高度會達到d,因此海拔低於d的城市都會被淹沒。
現在有q次詢問,每次問你一個矩形區域中,有多少城市不會被淹沒。
鏈接:https://ac.nowcoder.com/acm/contest/332/E
來源:牛客網
由於沿海,所以這個地區經常會發生海嘯。
海嘯發生時,部分城市會被淹沒,具體來說,海水高度會達到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≤ya≤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 海嘯