BZOJ1057 ZJOI2007 棋盤製作

2022-05-08 05:36:09 字數 2708 閱讀 5382

西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋、象棋以及日本的將棋同享盛名。據說西洋棋起源

於易經的思想,棋盤是乙個8*8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,

正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟他的好朋友小w決定

將棋盤擴大以適應他們的新規則。小q找到了一張由n*m個正方形的格仔組成的矩形紙片,每個格仔被塗有黑白兩種

顏色之一。小q想在這種紙中裁減一部分作為新棋盤,當然,他希望這個棋盤盡可能的大。不過小q還沒有決定是找

乙個正方形的棋盤還是乙個矩形的棋盤(當然,不管哪種,棋盤必須都黑白相間,即相鄰的格仔不同色),所以他

希望可以找到最大的正方形棋盤面積和最大的矩形棋盤面積,從而決定哪個更好一些。於是小q找到了即將參加全

國資訊學競賽的你,你能幫助他麼?

第一行包含兩個整數n和m,分別表示矩形紙片的長和寬。接下來的n行包含乙個n * m的01矩陣,表示這張矩形

紙片的顏色(0表示白色,1表示黑色)。

包含兩行,每行包含乙個整數。第一行為可以找到的最大正方形棋盤的面積,第二行為可以找到的最大矩形棋

盤的面積(注意正方形和矩形是可以相交或者包含的)。

3 31 0 1

0 1 0

1 0 046

n, m ≤ 2000

正解:單調棧 or 懸線法

解題報告:

為了鞏固單調棧來寫的這道題...

對於乙個題目要求的棋盤我們不是很好直接求,考慮我們可以把其轉換成我們熟悉的模型——最大全0子矩陣。對於為0而且橫縱座標奇偶性不同的標為1,為1而且橫縱座標奇偶性相同的標為1;對於為1而且橫縱座標不同的標為0,對於為0而且橫縱座標相同的標為0。題目就轉換成了最大全0子矩陣了。然後我們考慮單調棧的做法,維護乙個陣列,表示每個點最多可以往右拓展多遠(1為障礙)。按列做,一行行掃,單調棧裡面維護乙個拓展寬度遞增的值,發現當前行的這一列已經比棧頂元素小了,就彈棧直到合法。注意時刻更新一下答案,和棧中每個元素的實際控制範圍(即往上可以到達哪一行)。考慮我們如果棧頂元素為s,那麼i到棧頂所在行之間一定都比s大,不然s會在之前已經被彈出棧,所以相當於是s到i之間的這一大塊寬度就是s(其餘大於s的部分沒有用),畫一下圖就很快可以懂了。

當然,懸線法也是可以的,轉完模型就是裸題了。

單調棧:

1

//it is made by jump~

2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include

13using

namespace

std;

14 typedef long

long

ll;15

const

int inf = (1

<<30

);16

const

int maxn = 2011;17

intn,m,ans,ans2;

18int

a[maxn][maxn];

19int ri[maxn][maxn];//

可以往右延伸多少

20int

stack[maxn],top,up[maxn];

2122 inline int

getint()

2328 inline void getr()

29 inline void

geta()

42 stack[++top]=ri[i][j]; up[top]=to;43}

44}45}

4647 inline void

work()

5354

intmain()

55

懸線法:

1

//it is made by jump~

2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include

13using

namespace

std;

14 typedef long

long

ll;15

const

int inf = (1

<<30

);16

const

int maxn = 2011;17

intn,m,ans,ans2;

18int

a[maxn][maxn];

19int

topl[maxn],topr[maxn],nowl,nowr,up[maxn];

2021 inline int

getint()

2227

28 inline void

geta()

38else up[j]++,topl[j]=max(nowl+1

,topl[j]);39}

40for(int j=m;j>=1;j--)

44else50}

51}52}

5354 inline void

work()

6061

intmain()

62

BZOJ1057 ZJOI2007 棋盤製作

西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源 於易經的思想,棋盤是乙個8 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟他的好朋友小w決定 將...

bzoj1057 ZJOI2007 棋盤製作

傳送門 我們可以先用o nm 時間求出向左向右擴充套件的最大距離 然後o nm 列舉下端點位置 在矩形下面的邊上 計算出當高最高時的寬度,相乘後取max 正方形同理,只要取高度和寬度的min就行了。uses math var hei,a,x,y,le,ri array 0.2005,0.2005 o...

BZOJ1057 ZJOI2007 棋盤製作

西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源 於易經的思想,棋盤是乙個8 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟他的好朋友小w決定 將...