以下是简要题解:

  1. 首先思考如何判定一个矩形是否能通过操作变成全黑。

  2. 首先从简单而又特殊的 \(2 \times 2\) 的矩形开始,不难发现只要其中黑色数量不为奇数即可。

  3. 近一步拓展可以发现,一个矩形合法当且仅当所有 \(2 \times 2\) 的矩形均满足黑色数量不为奇数。

  4. 充分性显然,必要性证明思路如下:显然通过任意的操作不会改变 \(2 \times 2\) 子矩形黑色数量为偶数个的性质,通过构造一定能使得第一行第一列一定为黑色,那么根据一个矩形内部黑色数量不为奇数,必定可以推出矩形全黑。

  5. 于是问题就转化成:将 \(2 \times 2\) 的偶数数量矩形缩成点标号为 \(1\),否则标号为 \(0\),求最大全 \(1\) 子矩阵的大小。

  6. 这是一个经典问题,枚举底面就可以变成一个经典的一维单调栈问题。

要注意的是,单独一行或一列不存在 \(2 \times 2\) 的子矩形但都是可以变成全黑的。

#include <bits/stdc++.h>
using namespace std;
#define rep(i, l, r) for (int i = l; i <= r; ++i)
#define dep(i, l, r) for (int i = r; i >= l; --i)
const int N = 2e3 + 5;
char s[N][N]; int n, m, top, ans, l[N], r[N], h[N], st[N], a[N][N];
int calc(int x, int y) {
return (s[x][y] == '#') + (s[x + 1][y] == '#') + (s[x][y + 1] == '#') + (s[x + 1][y + 1] == '#');
}
int main () {
cin >> n >> m;
rep(i, 1, n) scanf("%s", s[i] + 1);
rep(i, 1, n - 1) rep(j, 1, m - 1) if(calc(i, j) % 2 == 0) a[i][j] = 1;
--n, --m;
rep(i, 1, n) {
memset(l, 0, sizeof(l)), memset(r, 0, sizeof(r));
rep(j, 1, m) h[j] = a[i][j] * h[j] + a[i][j];
top = 0;
dep(j, 1, m) {
for (; top && h[st[top]] > h[j]; --top) l[st[top]] = j;
st[++top] = j;
}
top = 0;
rep(j, 1, m) {
for (; top && h[st[top]] > h[j]; --top) r[st[top]] = j;
st[++top] = j;
}
rep(j, 1, m) if(!r[j]) r[j] = m + 1;
rep(j, 1, m) ans = max(ans, (h[j] + 1) * (r[j] - l[j]));
}
printf("%d", max(ans, max(n + 1, m + 1)));
return 0;
}

因为题目要求最大的能被涂成全黑的矩形,最朴素的想法判定一个矩形能被涂黑是非常重要的。

直接判定是不好判定的,可以从一些小而特殊的情况开始考虑,再观察一般情况与特殊情况的联系与区别。

同时,可以观察判定的必要条件,往往通过一些必要条件的组合就能推出判定的充分条件。

AT2699 [ARC081D] Flip and Rectangles的更多相关文章

  1. [Arc081F]Flip and Rectangles

    [Arc081F]Flip and Rectangles 试题分析 首先考虑如何操作,发现我们只会选若干行和若干列来进行一次取反. 这个东西相当于什么呢?相当于交点不变,然后这些行和这些列的其它点取反 ...

  2. [Agc081F/At2699] Flip and Rectangles - 单调栈,结论

    [Agc081F/At2699] 给出一个拥有 \(H\times W\) 个格子的棋盘,每个格子的颜色为黑色或白色. Snuke 可以进行任意次下列操作: 选择棋盘中的一行或一列,将这一行或一列的颜 ...

  3. [AT2699]Flip and Rectangles

    题目大意:有一个$n\times m$的$01$矩阵,可以把任意行或列反转,问最大的全为一的子矩阵的面积 题解:有一个结论:若一个子矩形$S$中的任意一个$2\times 2$的子矩形都含有偶数个$1 ...

  4. AtCoder Regular Contest 081 F - Flip and Rectangles

    题目传送门:https://arc081.contest.atcoder.jp/tasks/arc081_d 题目大意: 给定一个\(n×m\)的棋盘,棋盘上有一些黑点和白点,每次你可以选择一行或一列 ...

  5. Atcoder 乱做

    最近感觉自己思维僵化,啥都不会做了-- ARC103 F Distance Sums 题意 给定第 \(i\) 个点到所有点的距离和 \(D_i\) ,要求构造一棵合法的树.满足第 \(i\) 个点到 ...

  6. 【AtCoder】ARC081

    C - Make a Rectangle 每次取两个相同的且最大的边,取两次即可 #include <bits/stdc++.h> #define fi first #define se ...

  7. AtCoder Regular Contest 081

    C - Make a Rectangle 从大到小贪心即可. # include <bits/stdc++.h> using namespace std; map<int,int&g ...

  8. AtCoder Regular Contest 81

    链接 C.Make a Rectangle 给出一堆木棍的长度 从中选4根,询问在能围成矩形的情况下,矩形的最大面积 开个map统计一下就行 分正方形和矩形分别统计即可 复杂度$O(n \log n) ...

  9. AtCoder刷题记录

    构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...

随机推荐

  1. JS调用摄像头拍照,编辑jscam.swf自定义清晰度,兼容IE

    超级简单自定义宽高的jscam.swf文件: 下载swfmill,地址:http://download.csdn.net/download/wu3431214/9967414 下载mtasc,地址:h ...

  2. Android studio 报错 Unable to resolve dependency for ‘:app@releaseUnitTest/compileClasspath‘:

    出现报错: Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not find any ...

  3. 编写Java程序,实现从控制台输入对应个数的整数,输出对输入整数的从大到小显示

    编写Java程序,实现从控制台输入对应个数的整数,输出对输入整数的从大到小显示 效果如下: 实现代码: import java.util.Arrays; import java.util.Scanne ...

  4. SpringCloud创建Eureka模块集群

    1.说明 本文详细介绍Spring Cloud创建Eureka模块集群的方法, 基于已经创建好的Spring Cloud Eureka Server模块, 请参考SpringCloud创建Eureka ...

  5. PaperRead - Comparison of Fundamental Mesh Smoothing Algorithms for Medical Surface Models

    几种常见平滑算法的实现可以参见: 几种网格平滑算法的实现 - Jumanco&Hide - 博客园 (cnblogs.com) 1 Introduction 图像空间中相关的组织和结构,变换成 ...

  6. Win10 开启 Hyper-V 及简单使用

    简介 Windows 10 上内置了 Hyper-V.Hyper-V 提供硬件虚拟化,每个虚拟机都在虚拟硬件上运行. 系统要求 Windows 10 企业版.专业版或教育版.家庭版.移动版.移动企业版 ...

  7. Linux 安装并启用 PHP-FPM

    首先,在编译时带上 --enable-fpm 参数: [root@localhost local]# yum -y install libxml2 libxml2-devel gd gd-devel ...

  8. js 拟写登录页 可以拖动登录框

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  9. Oracle:使用PL-SQL登录时报ORA-12541:无监听程序的解决办法

    背景: 在自己公司安装的Oracle,当时Oracle的监听地址都是写的公司的地址 后来由于项目需要,办公地点转移到了客户处, 大概有半年没有以sys用户登录数据库了. 最近在上下班途中学习Djang ...

  10. 初识python: 自定义函数

    什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 函数的定义方法: def test(x): '函数定义方法' x+=1 r ...