翻转长方形 (不知名oj中一道个人私题)--单调栈维护最大子矩形
怎么分析这道题呢?
首先 ,我们注意到一点:
不管怎么操作,任意一个2*2方格中的 "#"个数的奇偶性是不变的。
所以,如果一个2*2方格中有奇数个"#",这个方格里的格子永远不可能变成同一种颜色。
并且,如果一个矩形中,所有2*2方格中有偶数个"#",那么它一定可以能变成只有一种颜色的矩形。
为什么?
先把这个矩形的第一行和第一列都变成同一种颜色,这个操作任何矩形都能做到。
如果这个矩形中,所有2*2方格中有偶数个"#",那么在左上角的2*2方格一定都是"#"。(一直是偶数个“#”)。这样在它右边的2*2方格同样一定都是"#"。以此类推,它一定可以能变成只有一种颜色的矩形。
然后我们再来维护最大的不包含有奇数个"#"的2*2方格的矩形。
这是一个经典问题,我们可以用单调栈来解决。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2005;
int h, w, len[maxn], up[maxn], down[maxn], nxt[maxn], ans;
char s[maxn][maxn];
int bad(int y, int x){
int ans = (s[y][x] == '#')^
(s[y][x+1] == '#')^
(s[y+1][x] == '#')^
(s[y+1][x+1] == '#');
return ans;
}
void solve(){
stack<int> stk;
for(int i=1;i<=h;i++){
while(!stk.empty() && len[stk.top()] >= len[i])
stk.pop();
if(stk.empty())up[i]=0;
else up[i]=stk.top();
if(len[i] != 0)stk.push(i);
}
while(!stk.empty()) stk.pop();
for(int i=h;i>=1;i--){
while(!stk.empty() && len[stk.top()] >= len[i])
stk.pop();
if(stk.empty())down[i]=h;
else down[i]=stk.top();
if(len[i] != 0)stk.push(i);
}
for(int i=1;i<=h;i++){
ans = max(ans, len[i]*(down[i]-up[i]));
// printf("%d:%d %d %d\n",i,len[i],down[i],up[i]);
}
}
int main()
{
scanf("%d%d",&h,&w);
for(int i = 1; i <= h; i++)
scanf("%s", s[i]+1);
for(int i = 1; i <= w; i++){
for(int j = 1; j <= h; j++){
if(nxt[j]) len[j] = 1;
else len[j]++;
if(bad(j,i) && i!=w && j!=h) nxt[j] = 1;
else nxt[j] = 0;
// printf("%d\n",nxt[j]);
}
// printf("\n");
solve();
}
printf("%d\n", ans);
return 0;
}
翻转长方形 (不知名oj中一道个人私题)--单调栈维护最大子矩形的更多相关文章
- SUST OJ 1675: Fehead的项目(单调栈)
1675: Fehead的项目 时间限制: 1 Sec 内存限制: 128 MB提交: 41 解决: 27[提交][状态][讨论版] 题目描述 Fehead俱乐部接手了一个项目,为了统计数据,他们 ...
- [补题]找到原序列长度k的子序列中字典序最小的那个(单调栈)
题意 题目如题,输入序列只包含小写字母,数据范围0<k<=len<=500000. 例: 输入:helloworld 输出:ellld 题解 使用单调栈.当已删掉n-k个字符,输出栈 ...
- 洛谷P1950 长方形(单调栈)
一道单调栈的好题啊...... 思路是很奇妙的,对于每个点(i,j),我们可以算它对答案的贡献(即包含它的矩形数量),包含该点的矩形,点的高度为h[j],点右边的高度一定大于等于h[j],左边的高度一 ...
- 在oj中Python的循环输入问题解决
在oj中Python的循环输入问题解决 在makefile中定义逗号字符串和空格字符串 在linux服务器上面部署javaweb项目jar包 数据结构与算法之栈(Java与Python实现) 在oj中 ...
- 洛谷P3926 SAC E#1 - 一道不可做题 Jelly【模拟/细节】
P3926 SAC E#1 - 一道不可做题 Jelly [链接]:https://www.luogu.org/problem/show?pid=3926 题目背景 SOL君(炉石主播)和SOL菌(完 ...
- l洛谷 P3926 SAC E#1 - 一道不可做题 Jelly
P3926 SAC E#1 - 一道不可做题 Jelly 题目背景 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢吃蒟蒻果冻.而SOL菌也很喜欢蒟蒻果冻. 有一 ...
- 利用简易爬虫完成一道基础CTF题
利用简易爬虫完成一道基础CTF题 声明:本文主要写给新手,侧重于表现使用爬虫爬取页面并提交数据的大致过程,所以没有对一些东西解释的很详细,比如表单,post,get方法,感兴趣的可以私信或评论给我.如 ...
- 记一次面试过程中的Python编程题
这几天面试过程中遇到一道Python编程题,题目如下: 面试中遇到一个Python编程问题:一个字符串,将里面的数字取出来,如果第一个数字前面是+,表示整个数字为正数,如果第一个数字前面是-,表示数字 ...
- 【死磕JVM】一道面试题引发的“栈帧”!!!
前言 最近小农的朋友--小勇在找工作,开年来金三银四,都想跳一跳,找个踏(gao)实(xin)点的工作,这不小勇也去面试了,不得不说,现在面试,各种底层各种原理,层出不穷,小勇就遇上了这么一道面试题, ...
随机推荐
- Python全栈习题一
1.执行 Python 脚本的两种方式 a../run.py 直接在命令行调用python脚本: b.python run.py 调用python解释器来调用Python脚本. 2.简述位.字节的关 ...
- jsp 错误处理
JSP提供了很好的错误处理能力.除了在Java代码 中可以使用try语句,还可以指定一个特殊页面.当应 用页面遇到未捕获的异常时,用户将看到一个精心设计 的网页解释发生了什么,而不是一个用户无法理解的 ...
- 恢复误删的DB table数据
由于一时手误输入了 DELETE FROM TABLE WHERE age REGEXP '\d';导致这个表的数据被删除 解决方法: 登录mysql,查看目前的binlog文件 mysql> ...
- hdu5758 思维,树形dp
/*可以推测从叶子结点传送到叶子节点才能使传送次数最少,如果是偶数个叶子结点,那么传送leaf/2次就是答案,如果是奇数个叶子结点,则还有单独一条链需要覆盖dp[u]表示覆盖完u为根的子树需要走的边数 ...
- medir设置
setting中 MEDIA_URL="/media/"MEDIA_ROOT=os.path.join(BASE_DIR, "app01","medi ...
- shell脚本批量创建用户
#!/bin/bash DATE=$(date +%F_%T) USER_FILE=user.txt echo_color() { == "green" ];then echo - ...
- C++ Primer 笔记——const 限定符
1.因为const对象一旦创建后其值就不能再改变,所以const对象必须初始化. 2.默认情况下const对象只在文件内有效,如果想在多个文件之间共享const对象,必须在变量的定义之前添加exter ...
- 插件使用一顶部消息提示---overhang
overhang 是一个非常好的消息提示插件,它是在顶部提示. 官方网站:https://github.com/paulkr/overhang.js 使用方法 1.引入jquery库和jqeury u ...
- 【TensorFlow】基于ssd_mobilenet模型实现目标检测
最近工作的项目使用了TensorFlow中的目标检测技术,通过训练自己的样本集得到模型来识别游戏中的物体,在这里总结下. 本文介绍在Windows系统下,使用TensorFlow的object det ...
- 金蝶k3密码批量修改
该字段含有单引号,直接使用查询语句,需要转义其中的单引号.select * from t_User where FSID = ') F ", ,P T #8 *P!D &D 80!N ...