JZOJ5242 GDOI2018模擬8 8 矩陣

2021-08-05 21:58:29 字數 1463 閱讀 2077

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 跑了一遍之後將路過的邊清...