怎么分析这道题呢?

首先 ,我们注意到一点:

不管怎么操作,任意一个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中一道个人私题)--单调栈维护最大子矩形的更多相关文章

  1. SUST OJ 1675: Fehead的项目(单调栈)

    1675: Fehead的项目 时间限制: 1 Sec  内存限制: 128 MB提交: 41  解决: 27[提交][状态][讨论版] 题目描述 Fehead俱乐部接手了一个项目,为了统计数据,他们 ...

  2. [补题]找到原序列长度k的子序列中字典序最小的那个(单调栈)

    题意 题目如题,输入序列只包含小写字母,数据范围0<k<=len<=500000. 例: 输入:helloworld 输出:ellld 题解 使用单调栈.当已删掉n-k个字符,输出栈 ...

  3. 洛谷P1950 长方形(单调栈)

    一道单调栈的好题啊...... 思路是很奇妙的,对于每个点(i,j),我们可以算它对答案的贡献(即包含它的矩形数量),包含该点的矩形,点的高度为h[j],点右边的高度一定大于等于h[j],左边的高度一 ...

  4. 在oj中Python的循环输入问题解决

    在oj中Python的循环输入问题解决 在makefile中定义逗号字符串和空格字符串 在linux服务器上面部署javaweb项目jar包 数据结构与算法之栈(Java与Python实现) 在oj中 ...

  5. 洛谷P3926 SAC E#1 - 一道不可做题 Jelly【模拟/细节】

    P3926 SAC E#1 - 一道不可做题 Jelly [链接]:https://www.luogu.org/problem/show?pid=3926 题目背景 SOL君(炉石主播)和SOL菌(完 ...

  6. l洛谷 P3926 SAC E#1 - 一道不可做题 Jelly

    P3926 SAC E#1 - 一道不可做题 Jelly 题目背景 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢吃蒟蒻果冻.而SOL菌也很喜欢蒟蒻果冻. 有一 ...

  7. 利用简易爬虫完成一道基础CTF题

    利用简易爬虫完成一道基础CTF题 声明:本文主要写给新手,侧重于表现使用爬虫爬取页面并提交数据的大致过程,所以没有对一些东西解释的很详细,比如表单,post,get方法,感兴趣的可以私信或评论给我.如 ...

  8. 记一次面试过程中的Python编程题

    这几天面试过程中遇到一道Python编程题,题目如下: 面试中遇到一个Python编程问题:一个字符串,将里面的数字取出来,如果第一个数字前面是+,表示整个数字为正数,如果第一个数字前面是-,表示数字 ...

  9. 【死磕JVM】一道面试题引发的“栈帧”!!!

    前言 最近小农的朋友--小勇在找工作,开年来金三银四,都想跳一跳,找个踏(gao)实(xin)点的工作,这不小勇也去面试了,不得不说,现在面试,各种底层各种原理,层出不穷,小勇就遇上了这么一道面试题, ...

随机推荐

  1. C++ gethostname()

    使用“gethostname();”获取计算机名,先看源码: 在Code::Blocks 16.01中,设置project的Build options...,Debug > Linker set ...

  2. js 压缩上传的图片方法(默认上传的是file文件)

    //压缩图片方法 function compressImg(file,callback){ var src; var fileSize = parseFloat(parseInt(file['size ...

  3. 论文阅读笔记十四:Decoupled Deep Neural Network for Semi-supervised Semantic Segmentation(CVPR2015)

    论文链接:https://arxiv.org/abs/1506.04924 摘要 该文提出了基于混合标签的半监督分割网络.与当前基于区域分类的单任务的分割方法不同,Decoupled 网络将分割与分类 ...

  4. 插件使用一颜色选择器---cxColor

    cxColor 是一款颜色选择器.这样的插件使用场景不多.可喜的这是国人写的. 官方网站: https://github.com/ciaoca/cxColor 使用方法: 1.引入jquery库 1 ...

  5. Paddington2

  6. 升级 Apache Tomcat的办法

    1.下载最新的7系列tomcat cd /usr/local/software wget https://www-us.apache.org/dist/tomcat/tomcat-7/v7.0.92/ ...

  7. Android之Error: 'L' is not a valid file-based resource name character解决办法

    1.问题 Error:Execution failed for task ':mergeBYODReleaseResources'.> /home/chenyu/Android_dev/sang ...

  8. Notepad++文件自动更新

  9. webpack学习笔记--区分环境

    为什么需要区分环境 在开发网页的时候,一般都会有多套运行环境,例如: 在开发过程中方便开发调试的环境. 发布到线上给用户使用的运行环境. 这两套不同的环境虽然都是由同一套源代码编译而来,但是代码内容却 ...

  10. C#学习-面向对象

    封装:把客观事物封装成类,并将类内部的实现隐藏,以保证数据的完整性: 比如年龄赋值为负数,就是个例子.当我们把类的字段定义为公共类型时,外部对象可以直接对类内部的数据进行操作,此时无法对这些操作进行一 ...