【ZJOI2007】棋盘制作 BZOJ1057
Description
国 际象棋是世界上最古老的博弈游戏之一,和中国的围棋、象棋以及日本的将棋同享盛名。据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方 阵,对应八八六十四卦,黑白对应阴阳。而我们的主人公小Q,正是国际象棋的狂热爱好者。作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好 朋友小W决定将棋盘扩大以适应他们的新规则。小Q找到了一张由N*M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一。小Q想在这种纸中裁 减一部分作为新棋盘,当然,他希望这个棋盘尽可能的大。不过小Q还没有决定是找一个正方形的棋盘还是一个矩形的棋盘(当然,不管哪种,棋盘必须都黑白相 间,即相邻的格子不同色),所以他希望可以找到最大的正方形棋盘面积和最大的矩形棋盘面积,从而决定哪个更好一些。于是小Q找到了即将参加全国信息学竞赛 的你,你能帮助他么?
Input
第一行包含两个整数N和M,分别表示矩形纸片的长和宽。接下来的N行包含一个N * M的01矩阵,表示这张矩形纸片的颜色(0表示白色,1表示黑色)。
Output
包含两行,每行包含一个整数。第一行为可以找到的最大正方形棋盘的面积,第二行为可以找到的最大矩形棋盘的面积(注意正方形和矩形是可以相交或者包含的)。
Sample Input
1 0 1
0 1 0
1 0 0
Sample Output
6
HINT
对于100%的数据,N, M ≤ 2000
思路
这次浙江的题目居然没有考数据结构,简直卜科学。。
不过是一个经典题目的变形,最大全0/1子矩阵。
我们注意到如果把所有 (行数+列数)%2==1的格子颜色翻转的话,一个棋盘就变成了相同的颜色了。然后就变成了最大0/1子矩阵了。
不过这个我也不会写,怒百度之。
O(n2)算法。比如求全1矩阵
用h[i]表示当前行第i列向上连续的1的个数,L[i]表示向左能够到哪一行(即h[L[i]]~h[i]均<=h[i]),R[i]表示向右能够到哪一行。
每次处理一行,从左往右处理L[i],从右往左处理R[i]。
当h[i]<=h[L[i]-1]时,L[i]=L[L[i]-1],向右同理。
具体见代码。
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
#include <vector>
#include <ctime>
#include <functional>
#define pritnf printf
#define scafn scanf
#define sacnf scanf
#define For(i,j,k) for(int i=(j);i<=(k);(i)++)
#define Clear(a) memset(a,0,sizeof(a))
using namespace std;
typedef unsigned int Uint;
const int INF=0x3fffffff;
///==============struct declaration============== ///==============var declaration=================
const int MAXN=;
int row,col;
int pic[MAXN][MAXN];
int h[MAXN],l[MAXN],r[MAXN];
///==============function declaration============
int FindSquare(int val);
int FindRectangle(int val);
///==============main code=======================
int main()
{
#define FILE__
#ifdef FILE__
freopen("input","r",stdin);
freopen("output","w",stdout);
#endif
scanf("%d%d",&row,&col);
for(int i=;i<=row;i++)
for(int j=;j<=col;j++){
scanf("%d",&pic[i][j]);
if ((i+j)&) pic[i][j]=!pic[i][j];
}
printf("%d\n",max(FindSquare(),FindSquare()));
printf("%d\n",max(FindRectangle(),FindRectangle()));
return ;
}
///================fuction code====================
int FindSquare(int val){
memset(h,,sizeof(h));int ans=;
for(int i=;i<=row;i++){
for(int j=;j<=col;j++)
if (pic[i][j]==val) h[j]=h[j]+;
else h[j]=;
for(int j=;j<=col;j++){
l[j]=j;
while (l[j]>&&h[l[j]-]>=h[j])
l[j]=l[l[j]-];
}
for(int j=col;j>=;j--){
r[j]=j;
while (r[j]<col&&h[r[j]+]>=h[j])
r[j]=r[r[j]+];
}
for(int j=;j<=col;j++){
int w=r[j]-l[j]+;
w=min(w,h[j]);
ans=max(ans,w*w);
}
}
return ans;
}
int FindRectangle(int val){
memset(h,,sizeof(h));int ans=;
for(int i=;i<=row;i++){
for(int j=;j<=col;j++)
if (pic[i][j]==val) h[j]=h[j]+;
else h[j]=;
for(int j=;j<=col;j++){
l[j]=j;
while (l[j]>&&h[l[j]-]>=h[j])
l[j]=l[l[j]-];
}
for(int j=col;j>=;j--){
r[j]=j;
while (r[j]<col&&h[r[j]+]>=h[j])
r[j]=r[r[j]+];
}
for(int i=;i<=col;i++){
int w=r[i]-l[i]+;
ans=max(ans,w*h[i]);
}
}
return ans;
}
BZOJ1057
【ZJOI2007】棋盘制作 BZOJ1057的更多相关文章
- BZOJ1057 [ZJOI2007]棋盘制作(极大化思想)
1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 1848 Solved: 936 [Submit][Sta ...
- BZOJ1057 [ZJOI2007]棋盘制作 【最大同色矩形】
1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 3248 Solved: 1636 [Submit][St ...
- 洛谷 P1169 [ZJOI2007]棋盘制作
2016-05-31 14:56:17 题目链接: 洛谷 P1169 [ZJOI2007]棋盘制作 题目大意: 给定一块矩形,求出满足棋盘式黑白间隔的最大矩形大小和最大正方形大小 解法: 神犇王知昆的 ...
- bzoj 1057: [ZJOI2007]棋盘制作 单调栈
题目链接 1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2027 Solved: 1019[Submit] ...
- BZOJ 1057: [ZJOI2007]棋盘制作( dp + 悬线法 )
对于第一问, 简单的dp. f(i, j)表示以(i, j)为左上角的最大正方形, f(i, j) = min( f(i + 1, j), f(i, j + 1), f(i + 1, j + 1)) ...
- 悬线法 || BZOJ 1057: [ZJOI2007]棋盘制作 || Luogu P1169 [ZJOI2007]棋盘制作
题面:P1169 [ZJOI2007]棋盘制作 题解: 基本是悬线法板子,只是建图判断时有一点点不同. 代码: #include<cstdio> #include<cstring&g ...
- P1169 [ZJOI2007]棋盘制作 && 悬线法
P1169 [ZJOI2007]棋盘制作 给出一个 \(N * M\) 的 \(01\) 矩阵, 求最大的正方形和最大的矩形交错子矩阵 \(n , m \leq 2000\) 悬线法 悬线法可以求出给 ...
- [luogu P1169] [ZJOI2007]棋盘制作
[luogu P1169] [ZJOI2007]棋盘制作 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的 ...
- 1057: [ZJOI2007]棋盘制作
1057: [ZJOI2007]棋盘制作 https://www.lydsy.com/JudgeOnline/problem.php?id=1057 分析: 首先对于(i+j)&1的位置0-& ...
- 【BZOJ 1057】 1057: [ZJOI2007]棋盘制作
1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源 于易经的思想,棋盘是一个8*8大小的 ...
随机推荐
- 监控jvm的一个坑
监控jvm的一个坑 1,遇到的问题 我按照以往文档,在catalina.sh里追加jvm的监控api,如下 紧接着我启动 tomcat. 未报任何错误. 发现 lsof –i:12000, 12000 ...
- 10个CSS简写及优化技巧
CSS简写就是指将多行的CSS属性简写成一行,又称为CSS代码优化或CSS缩写.CSS简写的最大好处就是能够显著减少CSS文件的大小,优化网站整体性能,更加容易阅读. 下面介绍常见的CSS简写规则: ...
- 【JavaScript】【CSS】前端规则摘抄
源:http://zhibimo.com
- 77 swapoff-关闭系统交换区
Linux swapoff命令用于关闭系统交换区(swap area). swapoff实际上为swapon的符号连接,可用来关闭系统的交换区. 语法 swapoff [设备] 参数: -a 将/et ...
- C#嵌入dll到资源释放的问题
有些程序运行的时候,可能调用外部的dll,用户使用时可能会不小心丢失这些dll,导致程序无法正常运行,因此可以考虑将这些dll嵌入到资源中,启动时自动释放.对于托管的dll,我们可以用打包软件合成一个 ...
- HIbernate的property-ref属性
为公司之前的一个公交卡系统修改bug: 通过排查发现, 卡类型表和卡等级表是一对多的关系, 但是卡等级表中没有字段引用卡类型表的主键,而是引用了卡类型表中非主键的另外两个字段 通过查看hibernat ...
- windows服务 定时任务
1.c#程序做成windows服务 若用cmd安装: var path = Process.GetCurrentProcess().MainModule.FileName + " s&quo ...
- hdu2586 LCA
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- 理解 HTTPS 的工作原理
目标读者:理解HTTP协议,对称和非对称加密,想要了解HTTPS协议的工作原理. 读完本文,你能明白 什么是HTTPS,TLS(SSL),TLS和HTTPS是什么关系? 什么是证书和数字签名,它们是如 ...
- 五种开源协议(GPL,LGPL,BSD,MIT,Apache)
什么是许可协议? 什么是许可,当你为你的产品签发许可,你是在出让自己的权利,不过,你仍然拥有版权和专利(如果申请了的话),许可的目的是,向使用你产品的人提供 一定的权限. 不管产品是免费向公众分发,还 ...