輸入的時候就可以判斷出會不會淹沒, 所以輸入的時候預處理出一個0,1矩陣,1代表不會淹沒(h[i][j] >= d) 詢問次數很多,每次我們都要輸出要求的那個子矩陣的和, 很明顯還需要預處理一下,我們需要維護一個二維前綴和: s[i][j]為(0,0)到(i,j)的前綴和 假設現在我們要求如下圖中的子矩陣A的和: 那么: A = D - B - C + (B∩C)
即 ans = s [x][y]- s[a-1][y] - s[x][b-1] + s[a-1][b-1] 預處理前綴和數組s,是ans的逆過程 s[i][j] = (val>=d)+s[i-1][j]+s[i][j-1]-s[i-1][j-1] AC_code:
#include<bits/stdc++.h>using namespace std;intmain(){int n,m,d,val;scanf("%d%d%d",&n,&m,&d);int dp[n+2][m+2];for(int i =0; i <= n; i++){for(int j =0; j <= m; j++){dp[i][j]=0;}}for(int i =1; i <= n; i++){for(int j =1; j <= m; j++){scanf("%d",&val);dp[i][j]=(val>=d)+dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1];}}int t,a,b,x,y;scanf("%d",&t);while(t--){scanf("%d%d%d%d",&a,&b,&x,&y);int ans = dp[x][y]-dp[x][b-1]-dp[a-1][y]+dp[a-1][b-1];printf("%d\n",ans);}return0;}