【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大小的 ...
随机推荐
- Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds...
仰天长啸 Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds... 当启动tomcat时候出现 ...
- SSH整合 遇到的头疼的BUGs
折腾了7个小时,一个项目重新的拷贝.编译.部署.运行.测试,我终于知道了产生问题的所在. 问题一:项目编码没有问题,访问会报404 资源不可用 没有进行重新编译,编译完就好了,可能是拷贝项目的时候,没 ...
- Java里String.split需要注意的用法
我们常常用String的split()方法去分割字符串,有两个地方值得注意: 1. 当分隔符是句号时("."),需要转义: 由于String.split是基于正则表达式来分割字符串 ...
- 如何设置ASP.NET页面的运行超时时间
全局超时时间 服务器上如果有多个网站,希望统一设置一下超时时间,则需要设置 Machine.config 文件中的 ExecutionTimeout 属性值.Machine.config 文件位于 % ...
- mysql CREATE USER
CREATE USER 'Rhine'@'%' IDENTIFIED BY 'Rhine@2015'; GRANT ALL ON *.* TO 'Rhine'@'%'; flush privilege ...
- Cache,MemCache,Application,Cookie等其它缓存汇总
为了提高网页运行速度我们用到了各种缓存技术,今天就来汇总下,相信聪明的你也一定会有所收获的o(^▽^)o 1.Cache(PS:看见一个博客介绍的不错,我就直接Copy了) Cache 即高速缓存.那 ...
- PLSQL查询字段为科学计数法,修正显示
打开PLSQL工具--- toad中->view->option->data->display large number in scientific notationpl/sq ...
- C++标准库:std_map作为一个关联数组
摘要:std::map作为一个容器存在一个典型应用就是作为关联数组来作用.在诸如Java等等语言中,关联数组广泛存在.std::map是一个容器,在它的概念框架中存在两个词:键和值,std::map把 ...
- [React] 多组件生命周期转换关系
前段时间一直在基于React做开发,最近得空做一些总结,防止以后踩坑. 言归正传,React生命周期是React组件运行的基础,本文主要是归纳多组件平行.嵌套时,生命周期转换关系. 生命周期 Reac ...
- bzoj1588
splay #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...