01矩陣字首和

2022-07-15 13:54:08 字數 933 閱讀 7842

題目描述

給定乙個 \(n*m\)的 01 矩陣, 求包含 \([l,r]\)個 1的子矩形個數。

第一行,兩個正整數 n,m。 接下來 n行每乙個長度為 m的 01 串,表示給定的矩陣。 接下來 一行, 兩個自然數 l,r。

首先暴力列舉顯然不可取

注意到,n非常小,可以考慮一種\(o(n^2m)\)的方法

很套路,要將詢問拆成\([0,l-1]\)和\([0,r]\)來處理

\(o(n^2)\)來列舉矩形的上邊和下邊,

而字首和又是單調的,用個指標維護就好了,

具體的:如果我們已經確定了\(i\)列到\(j\)列間的1的個數在\([l,r]\)中,k列到j列的1也在\([l,r]\)中,並且滿足第\(i\)列比第\(k\)列小,那麼,矩形的一邊為\(j\)的情況下,另一邊可以為第\(i\)列到第\(k\)列間的任意一列。

所以,我們就可以通過尋找邊界的情況快速找到矩形的右邊固定情況所產生的答案。然後將矩形的右邊向右移動,判斷矩形的左邊的範圍是否變動,然後將這個範圍繼續加入答案,就可以解出答案了。

#include #include #include #include #define re register int

using namespace std;

char s[50010];

long long n,m,i,j,p[50010],sum[40][50010],q[50010],ans,k,l,r;

int main()

scanf("%lld%lld",&l,&r);

for(int i=1;i<=n;i++)//上

for(int j=i;j<=n;j++)

for(int k=1;k<=m;k++)

} printf("%lld\n",ans);

return 0;

}

海嘯 矩陣字首和

有乙個沿海地區,可以看作有n行m列的城市,第i行第j列的城市海拔為h i j 由於沿海,所以這個地區經常會發生海嘯。海嘯發生時,部分城市會被淹沒,具體來說,海水高度會達到d,因此海拔低於d的城市都會被淹沒。現在有q次詢問,每次問你乙個矩形區域中,有多少城市不會被淹沒。第一行三個整數n,m,d,具體含...

最大化(矩陣字首和)

矩陣字首和 神奇的剪枝 矩陣字首和 如圖,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 它擁有...