BZOJ1057: [ZJOI2007]棋盘制作
生活随笔
收集整理的這篇文章主要介紹了
BZOJ1057: [ZJOI2007]棋盘制作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
國際象棋是世界上最古老的博弈游戲之一,和中國的圍棋、象棋以及日本的將棋同享盛名。據說國際象棋起源 于易經的思想,棋盤是一個8*8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小Q, 正是國際象棋的狂熱愛好者。作為一個頂尖高手,他已不滿足于普通的棋盤與規則,于是他跟他的好朋友小W決定 將棋盤擴大以適應他們的新規則。小Q找到了一張由N*M個正方形的格子組成的矩形紙片,每個格子被涂有黑白兩種 顏色之一。小Q想在這種紙中裁減一部分作為新棋盤,當然,他希望這個棋盤盡可能的大。不過小Q還沒有決定是找 一個正方形的棋盤還是一個矩形的棋盤(當然,不管哪種,棋盤必須都黑白相間,即相鄰的格子不同色),所以他 希望可以找到最大的正方形棋盤面積和最大的矩形棋盤面積,從而決定哪個更好一些。于是小Q找到了即將參加全 國信息學競賽的你,你能幫助他么?Input
第一行包含兩個整數N和M,分別表示矩形紙片的長和寬。接下來的N行包含一個N * M的01矩陣,表示這張矩形 紙片的顏色(0表示白色,1表示黑色)。Output
包含兩行,每行包含一個整數。第一行為可以找到的最大正方形棋盤的面積,第二行為可以找到的最大矩形棋 盤的面積(注意正方形和矩形是可以相交或者包含的)。Sample Input
3 31 0 1
0 1 0
1 0 0
Sample Output
46
HINT
N, M ≤ 2000
Source
考慮黑白相間不好做 故把坐標和為奇數的格子取反 變成求一個全0矩陣 維護一個單調棧即可#include<bits/stdc++.h>using namespace std;const int maxn=2020;int n,m,top;int mp[maxn][maxn],h[maxn][maxn];int ans1,ans2;pair <int,int > st[maxn];inline void push(int pos,int H) {int cur=pos;while(top&&st[top].second>H){ans1=max(ans1,min(pos-st[top].first,st[top].second)*min(pos-st[top].first,st[top].second));ans2=max(ans2,(pos-st[top].first)*st[top].second);cur=st[top--].first;}st[++top]=make_pair(cur,H); }inline void cal() {for(int i=1;i<=n;i++){h[i][0]=0;for(int j=1;j<=m;j++)h[i][j]=mp[i][j]?h[i][j-1]+1:0;}for(int j=1;j<=m;j++){top=0;for(int i=1;i<=n;i++)push(i,h[i][j]);push(n+1,0);} }int main() {scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%d",&mp[i][j]);if((i+j)&1)mp[i][j]^=1;}cal();for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)mp[i][j]^=1;cal();printf("%d\n%d\n",ans1,ans2); }總結
以上是生活随笔為你收集整理的BZOJ1057: [ZJOI2007]棋盘制作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Excel2016图片缩放后不清晰
- 下一篇: 辐射剂量监测仪(一)