[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的更多相关文章

  1. [arc081F]Flip and Rectangles-[黑白染色]

    Description 传送门 Solution 有一个神秘的结论..我不知道大佬是怎么场上推出来的. 一个黑白染色图,每次可以任意翻转行或列的颜色,如果每个2*2的子矩阵内黑色格子都是偶数个,则可以 ...

  2. [AT2699]Flip and Rectangles

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

  3. AtCoder Regular Contest 081 F - Flip and Rectangles

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

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

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

  5. AT2699 [ARC081D] Flip and Rectangles

    以下是简要题解: 首先思考如何判定一个矩形是否能通过操作变成全黑. 首先从简单而又特殊的 \(2 \times 2\) 的矩形开始,不难发现只要其中黑色数量不为奇数即可. 近一步拓展可以发现,一个矩形 ...

  6. AtCoder刷题记录

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

  7. Atcoder 乱做

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

  8. 【AtCoder】ARC081

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

  9. AtCoder Regular Contest 081

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

随机推荐

  1. Java并发编程(4)--生产者与消费者模式介绍

    一.前言 这种模式在生活是最常见的,那么它的场景是什么样的呢? 下面是我假象的,假设有一个仓库,仓库有一个生产者和一个消费者,消费者过来消费的时候会检测仓库中是否有库存,如果没有了则等待生产,如果有就 ...

  2. 华硕笔记本U盘重装系统

    ESC启动把Secure Boot改为Disabled,Launch CSM改为Enabled,然后重新选择不带UEFI字样的U盘启动项.然后就可以找到U盘进入PE

  3. Python类相关的装饰器

    一.装饰器装饰类方法 from functools import wraps def wrapper(func): @wraps(func) def inner(self,*args,**kwargs ...

  4. xshell5 优化方案

    有道云笔记链接-> grep: 过滤 过滤的速度是最快的(相对于另外两个) -v -n -o   显示grep匹配到了什么 grep .  -o -i   --ignore-case -E == ...

  5. python基础--类的经典类vs新式类

    经典类VS新式类区别 1)写法新式类class Person(object):#new style 经典类class Persion: #classical style 2)调用父类 新式写法用sup ...

  6. 安装pywin32模块

    1.先下载pywin32对于的版本 下载地址:python for windows extensions 2.选择自己对应的版本,我的是python3.5版本 注意注意注意:此处一定要看清楚自己的py ...

  7. YUI Compressor 压缩 JavaScript 原理-《转载》

    YUI Compressor 压缩 JavaScript 的内容包括: 移除注释 移除额外的空格 细微优化 标识符替换(Identifier Replacement) YUI Compressor包括 ...

  8. ThinkPHP递归删除栏目

    ThinkPHP递归删除栏目 https://www.cnblogs.com/zlnevsto/p/7051875.html Thinkphp3.2 无限级分类删除,单个删除,批量删除 https:/ ...

  9. Python基础 - MySQLdb模块

    安装 pip install MySQLdb 使用 去除一个数据库中所有的表 import MySQLdb def db_test(): conn = MySQLdb.connect(user='&l ...

  10. java 内部类与控制框架

    应用程序控制框架(application framework)就是设计解决某类特殊问题的一个类,或一组类,要运用某个应用程序框架,通常是继承一个类或多个类,并覆盖这些方法.在覆盖的方法中编写代码定制应 ...