[Arc081F]Flip and Rectangles
[Arc081F]Flip and Rectangles

试题分析
首先考虑如何操作,发现我们只会选若干行和若干列来进行一次取反。
这个东西相当于什么呢?相当于交点不变,然后这些行和这些列的其它点取反。
那么也就是说,当一行的一段和上一行的一段互补或者相等的时候它们是一定能被搞成全黑矩形的。
然后基于这个结论,我就写了一个\(O(n^2\log n)\)的做法,然后完美地被卡了\(1.5\)的常数?!
当然,我们还可以继续考虑一下,发现做两遍差分以后这个问题会变得简单,枚举左端点,然后右端点求出最远到哪里(二维差分后当前段最长的0)
这个用单调栈维护即可,然后对于每一个位置,可以单调栈求出它最左边和最右边最远到哪里,用这个更新答案即可。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
//#include<ctime>
//#include<cmath>
//#include<queue>
using namespace std;
#define LL long long
inline LL read(){
LL x=0,f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const LL INF = 2147483600;
const LL MAXN = 100010;
LL H,W;
char str[MAXN+1];
LL base[2001],All[2001];
LL f[2001][2001];
LL sta[MAXN+1];
LL L[MAXN+1],R[MAXN+1];
LL Hei[MAXN+1];
bool a[2001][2001];
inline void Get_Da(){
int top=0; sta[++top]=1;
for(LL i=2;i<=H;i++) {
while(top&&Hei[sta[top]]>=Hei[i]) --top;
L[i]=sta[top]+1; sta[++top]=i;
} top=0; sta[++top]=H+1;
for(LL i=H;i>=2;i--) {
while(top&&Hei[sta[top]]>=Hei[i]) --top;
R[i]=sta[top]-1; sta[++top]=i;
} return ;
}
vector<int> vec[2001];
int to[MAXN+1];
int main(){
//freopen("a.in","r",stdin);
//freopen("T2s.out","w",stdout);
H=read(),W=read();
for(LL i=1;i<=W;i++) base[i]=rand(),All[i]=All[i-1]^base[i];//cout<<"base:"<<base[i]<<endl;
for(LL i=1;i<=H;i++){
scanf("%s",str+1);
for(LL j=1;j<=W;j++){
a[i][j]=(str[j]=='#');
f[i][j]=a[i][j]^a[i-1][j];
}
}
for(int i=1;i<=H;i++){
int top=0;
for(int j=W;j>=2;j--){
f[i][j]=f[i][j-1]^f[i][j];
if(f[i][j]) sta[++top]=j;
} for(int j=top;j>=1;j--)
vec[i].push_back(sta[j]);
vec[i].push_back(W+1);
} LL ans=max(H,W);
//cout<<"True:"<<True(2,1,3)<<endl;
for(LL l=1;l<W;l++){
//cout<<l<<": ";
for(LL i=2;i<=H;i++)
if(l>=vec[i][to[i]]) ++to[i];
for(LL i=2;i<=H;i++) Hei[i]=vec[i][to[i]]-1-l+1;
Get_Da();
for(LL i=2;i<=H;i++)
ans=max(ans,(R[i]-L[i]+2)*Hei[i]);
} printf("%lld\n",ans);
return 0;
}
[Arc081F]Flip and Rectangles的更多相关文章
- [arc081F]Flip and Rectangles-[黑白染色]
Description 传送门 Solution 有一个神秘的结论..我不知道大佬是怎么场上推出来的. 一个黑白染色图,每次可以任意翻转行或列的颜色,如果每个2*2的子矩阵内黑色格子都是偶数个,则可以 ...
- [AT2699]Flip and Rectangles
题目大意:有一个$n\times m$的$01$矩阵,可以把任意行或列反转,问最大的全为一的子矩阵的面积 题解:有一个结论:若一个子矩形$S$中的任意一个$2\times 2$的子矩形都含有偶数个$1 ...
- AtCoder Regular Contest 081 F - Flip and Rectangles
题目传送门:https://arc081.contest.atcoder.jp/tasks/arc081_d 题目大意: 给定一个\(n×m\)的棋盘,棋盘上有一些黑点和白点,每次你可以选择一行或一列 ...
- [Agc081F/At2699] Flip and Rectangles - 单调栈,结论
[Agc081F/At2699] 给出一个拥有 \(H\times W\) 个格子的棋盘,每个格子的颜色为黑色或白色. Snuke 可以进行任意次下列操作: 选择棋盘中的一行或一列,将这一行或一列的颜 ...
- AT2699 [ARC081D] Flip and Rectangles
以下是简要题解: 首先思考如何判定一个矩形是否能通过操作变成全黑. 首先从简单而又特殊的 \(2 \times 2\) 的矩形开始,不难发现只要其中黑色数量不为奇数即可. 近一步拓展可以发现,一个矩形 ...
- AtCoder刷题记录
构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...
- Atcoder 乱做
最近感觉自己思维僵化,啥都不会做了-- ARC103 F Distance Sums 题意 给定第 \(i\) 个点到所有点的距离和 \(D_i\) ,要求构造一棵合法的树.满足第 \(i\) 个点到 ...
- 【AtCoder】ARC081
C - Make a Rectangle 每次取两个相同的且最大的边,取两次即可 #include <bits/stdc++.h> #define fi first #define se ...
- AtCoder Regular Contest 081
C - Make a Rectangle 从大到小贪心即可. # include <bits/stdc++.h> using namespace std; map<int,int&g ...
随机推荐
- linux快速复制大量小文件方法 nc+tar【转】
1,在需要对大量小文件进行移动或复制时,用cp.mv都会显得很没有效率,可以用tar先压缩再解压缩的方式. 2,在网络环境中传输时,可以再结合nc命令,通过管道和tcp端口进行传输. nc和tar ...
- ADB常用命令(二)
参考 http://adbshell.com/commands 常用命令 查看adb 版本 adb version 打印所有附加模拟器/设备的列表 adb devices 设备序列号 adb get ...
- node项目中用到的一些模块
1.http模块,用来搭建服务器 代码,简单服务器实现 var http = require('http'); http.createServer(function (request, respons ...
- Java基础82 jsp中的EL表达式(网页知识)
1.EL表达式的作用 EL表达式的作用:向浏览器输出域对象中的变量值或者表达式计算结果.语法:${变量或者表达式} 注: Jsp的核心语法:jsp的表达式<%= %>和jsp的脚本< ...
- java基础76 web服务器之Tomcat服务器
(注:本文是以“压缩版Tomcat”为例,展开描述的) 一.Tomcat服务器的介绍 1.服务器 1.1.服务器的种类 从物理上讲:服务器就是一台pc机器.至少8核/8G以上.内存至少用T来计算.宽带 ...
- 洛谷P3811乘法逆元
传送门 线性递推 #include <iostream> #include <cstdio> #include <cstring> #include <alg ...
- Java字符串拼接效率对比
1.来自:http://blog.csdn.net/Zen99T/article/details/51255418 2.来自:http://blog.csdn.net/kimsoft/article/ ...
- 20165203《Java程序设计》第七周Java学习总结
20165203<Java程序设计>第七周Java学习总结 教材学习内容总结 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系统,简称MySQL,是世 ...
- c++实现二叉树的非递归创建以及非递归先序、中序、后序遍历
二叉树的创建 思路:数组中从上到下依次放着二叉树中的元素,使用递归很容易实现,那么这里使用容器来存放之前的状态实现循环创建二叉树. TreeNode* createTree(int *arr, int ...
- MIT6.006Lec02:DocumentDistance
MIT6.006是算法导论,Lec02讲的是Document Distance(文档距离),比如比较两个文档相似度或者搜索引擎中都会用到. 计算步骤为: 1.将每个文档分离为单词 2.统计词频 3.计 ...