description
給出乙個n*m 的01 矩陣,求其中有多少個連續子矩陣,使得其面積大於等於k,且其中不包含1。
input
第一行為用空格隔開的三個整數n, m, k。分別表示矩陣的行數,列數和子矩陣的最小面積。
接下來的n 行每行為用空格隔開的m 個整數,為題目中給出的矩陣。
output
輸出一行乙個整數,為滿足條件的子矩陣個數。
sample input
2 4 3
1 0 0 0
1 1 0 0
sample output
data constraint
對20%的資料,滿足1 <= n, m <= 100;
對40%的資料,滿足1 <= n, m <= 500;
對60%的資料,滿足1 <= n, m <= 2000;
對100%的資料,滿足1 <= n, m <= 4,000,1 <= k <= n * m;
hint
設(a, b, c, d)表示左上角為(a, b),右下角為(c, d)的子矩陣。
面積為1 的子矩陣:(1, 2, 1, 2), (1, 3, 1, 3), (1, 4, 1, 4), (2, 3, 2, 3), (2, 4, 2, 4);
面積為2 的子矩陣:(1, 2, 1, 3), (1, 3, 1, 4), (2, 3, 2, 4), (1, 3, 2, 3), (1, 4, 2, 4);
面積為3 的子矩陣:(1, 2, 1, 4);
面積為4 的子矩陣:(1, 3, 2, 4)。
其中面積大於等於3 的有兩個。
其實這題一點都不難,只是要想細一點。。
預處理出每個0能往右移動的最多位置。
對於每一列上的點,用單調棧處理,預處理個tot[i][j]表示字首和,就可以方便的求出答案了。
using namespace std;
const int n=4e3+5;
const int m=1e5+5;
typedef long long ll;
int mp[n][n];
int n,m,h[n][n],a[m],b[m];
ll tot[n][n],right[n][n],ans;
bool vis[n][n];
int sta[m],top;
int s;
int main() }
fo(i,1,n)
fd(j,m,1)
if (mp[i][j]!=1)
right[i][j]=right[i][j+1]+1;
fo(i,1,n)
fo(j,1,m)
ll ans=0;
fo(j,1,m)
}}/*fo(i,1,n)
*/printf("%lld\n",ans);
JZOJ5242 GDOI模擬 矩陣
給出乙個n m 的01 矩陣,求其中有多少個連續子矩陣,使得其面積大於等於k,且其中不包含1。非常經典的一道題目。首先我們很容易知道n 3的方法。那麼我們來優化一下。我們先求出f i j 表示從 i,j 向右連續1的數量。然後把這些從大到小的插入 桶排一下 然後如果上面或下面已經有了就合併,然後算出...
JZOJ5233 GDOI模擬 概率博弈
小a和小b在玩遊戲。這個遊戲是這樣的 有一棵n個點的以1為根的有根樹,葉子有權值。假設有m個葉子,那麼樹上每個葉子的權值序列就是乙個1 m 的排列。一開始在1號點有一顆棋子。兩人輪流將這顆棋子移向其當前位置的乙個兒子。假如棋子到達葉子,遊戲結束,最終獲得的權值為所在葉子對應權值。小a希望最後的權值盡...
JZOJ3400 GDOI2014模擬 旅行
給你乙個圖,讓你選擇權值和最小的邊,使得 1 和 n 2 和 n 1 k 和 n k 1 聯通。k leq 4 一看到這題就覺得特別神仙 然後去思考網路流 搞出了乙個最小割,後來發現這是錯的 匆匆打了個表,獲得了這題的十分之一的分數。其實這題有水法,許多人是全排列 spfa 跑了一遍之後將路過的邊清...