日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ-1057: [ZJOI2007]棋盘制作(单调栈)

發布時間:2023/12/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ-1057: [ZJOI2007]棋盘制作(单调栈) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1057: [ZJOI2007]棋盤制作

Time Limit:?20 Sec??Memory Limit:?162 MB
Submit:?3096??Solved:?1567
[Submit][Status][Discuss]

Description

?

國際象棋是世界上最古老的博弈游戲之一,和中國的圍棋、象棋以及日本的將棋同享盛名。據說國際象棋起源 于易經的思想,棋盤是一個8*8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小Q, 正是國際象棋的狂熱愛好者。作為一個頂尖高手,他已不滿足于普通的棋盤與規則,于是他跟他的好朋友小W決定 將棋盤擴大以適應他們的新規則。小Q找到了一張由N*M個正方形的格子組成的矩形紙片,每個格子被涂有黑白兩種 顏色之一。小Q想在這種紙中裁減一部分作為新棋盤,當然,他希望這個棋盤盡可能的大。不過小Q還沒有決定是找 一個正方形的棋盤還是一個矩形的棋盤(當然,不管哪種,棋盤必須都黑白相間,即相鄰的格子不同色),所以他 希望可以找到最大的正方形棋盤面積和最大的矩形棋盤面積,從而決定哪個更好一些。于是小Q找到了即將參加全 國信息學競賽的你,你能幫助他么?

Input

第一行包含兩個整數N和M,分別表示矩形紙片的長和寬。接下來的N行包含一個N * M的01矩陣,表示這張矩形 紙片的顏色(0表示白色,1表示黑色)。

Output

包含兩行,每行包含一個整數。第一行為可以找到的最大正方形棋盤的面積,第二行為可以找到的最大矩形棋 盤的面積(注意正方形和矩形是可以相交或者包含的)。

Sample Input

3 3
1 0 1
0 1 0
1 0 0

Sample Output

4
6

HINT

?

N, M ≤ 2000

?

Source

laj的單調棧wa了???smg啊QAQ 然鵝那hzwer的標程對拍并沒有發現輸出錯誤的數據ovo laj還是太naive了

單調棧的思路很巧妙,把奇數位的顏色取反,然后一行行的求最大矩形面積即可ovo然鵝laj就是沒過QAQ

粘上laj的錯誤代碼ovo

1 #include "bits/stdc++.h" 2 using namespace std; 3 typedef long long LL; 4 const int MAX=2005; 5 int n,m; 6 int a[MAX][MAX],b[MAX],c[MAX]; 7 int ans1,ans2; 8 int q1[MAX],q2[MAX]; 9 inline int read(){ 10 int an=0,x=1;char c=getchar(); 11 while (c<'0' || c>'9') {if (c=='-') x=-1;c=getchar();} 12 while (c>='0' && c<='9') {an=an*10+c-'0';c=getchar();} 13 return an*x; 14 } 15 int main(){ 16 freopen ("chess.in","r",stdin); 17 freopen ("chess.out","w",stdout); 18 int i,j; 19 n=read(),m=read(); 20 for (i=1;i<=n;i++){ 21 for (j=1;j<=m;j++){ 22 a[i][j]=read(); 23 if ((i+j)%2) a[i][j]^=1; 24 } 25 } 26 memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); 27 int zt1,zt2; 28 for (i=1;i<=n;i++){ 29 q1[0]=0; 30 for (j=1;j<=m;j++){ 31 if (a[i][j]) 32 b[j]++,c[j]=0; 33 else 34 b[j]=0,c[j]++; 35 while (q1[0] && b[q1[q1[0]]]>b[j]){ 36 zt1=q1[q1[0]]; 37 ans1=max(ans1,b[zt1]*(j-1-q1[q1[0]-1])); 38 ans2=max(ans2,min(b[zt1],j-1-q1[q1[0]-1])*min(b[zt1],j-1-q1[q1[0]-1])); 39 q1[0]--; 40 } 41 q1[++q1[0]]=j; 42 while (q2[0] && c[q2[q2[0]]]>c[j]){ 43 zt2=q2[q2[0]]; 44 ans1=max(ans1,c[zt2]*(j-1-q2[q2[0]-1])); 45 ans2=max(ans2,min(c[zt2],j-1-q2[q2[0]-1])*min(c[zt2],j-1-q2[q2[0]-1])); 46 q2[0]--; 47 } 48 q2[++q2[0]]=j; 49 } 50 int zt2=q1[q1[0]]; 51 while (q1[0]>1){ 52 zt1=q1[q1[0]]; 53 ans1=max(ans1,b[zt1]*(zt2-q1[q1[0]-1])); 54 ans2=max(ans2,min(b[zt1],zt2-q1[q1[0]-1])*min(b[zt1],zt2-q1[q1[0]-1])); 55 q1[0]--; 56 } 57 ans1=max(ans1,q1[q1[0]]); 58 zt2=q2[q2[0]]; 59 while (q2[0]){ 60 zt1=q2[q2[0]]; 61 ans1=max(ans1,c[zt1]*(zt2-q2[q2[0]-1])); 62 ans2=max(ans2,min(c[zt1],zt2-q2[q2[0]-1])*min(c[zt2],zt2-q2[q2[0]-1])); 63 q2[0]--; 64 } 65 ans2=max(ans2,q2[q2[0]]); 66 } 67 printf("%d\n%d",ans2,ans1); 68 return 0; 69 }

?

轉載于:https://www.cnblogs.com/keximeiruguo/p/7689556.html

總結

以上是生活随笔為你收集整理的BZOJ-1057: [ZJOI2007]棋盘制作(单调栈)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。