[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. 《区块链100问》第84集:资产代币化之对标黄金Digix

    黄金是避险的不二选择.Digix发行的黄金代币则是数字资产世界里的黄金,其代币简称DGX,能够在数字资产世界中起到避险的作用. DGX如何实现对标黄金呢?它将黄金资产进行了上链(即:区块链)操作.举个 ...

  2. WeX5入门之HelloWorld

    学习目标:数据双向绑定 在ui2上右键 新建一个应用 然后会出现一个目录 右键hello 在创建页面 选择标准的空白模板 并起一个名 自动生成这两个文件 建立一个input组件 再建一个output组 ...

  3. UNIX环境高级编程 第14章 高级I/O

    这一章涉及很多概念和函数,包括:非阻塞I/O.记录锁.I/O复用.异步I/O.readv和writev函数以及内存映射. 非阻塞I/O 在Unix中,可以将系统调用分为两种,一种是“低速”系统调用,另 ...

  4. C#里partial关键字的作用

    1. 什么是局部类型?C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中.局部类型适用于以下情况: (1) 类型特别大,不宜放在一个 ...

  5. 洛谷P2458 保安站岗

    传送门啦 分析: 树形dp刚刚入门,这是我做的第一个一个点同时受父亲节点和儿子节点控制的题目. 由于这个题中某一个点放不放保安与父亲和儿子都有关系(因为线段的两个端点嘛),所以我们做题时就要考虑全面. ...

  6. SQL Server 2000 系统存储过程

    SQL Server 2000 系统存储过程 在 Microsoft? SQL Server? 中,许多管理和信息活动可以通过系统存储过程执行.系统存储过程按这些分类分组. 分类 描述 Active ...

  7. 一个文件系统过滤驱动的demo

    因为没写过FSD过滤驱动,所以拿来练练手,没有什么技术含量.参考自Win内核安全与驱动开发. 先梳理一下大概的流程,就是怎么去绑定设备栈.怎么去过滤各种请求的. 首先肯定是要绑定设备栈的,来看下怎么绑 ...

  8. uc 下载页面 记录备份

    记录一下 <!doctype html> <html> <head> <meta charset="utf-8"> <titl ...

  9. 关键字final和override

    final关键字 限制某个类或结构体不能被继承 直接对类声明: class A final{}; class B : public A {}; 或这类内有final函数,类可以被继承,但是final函 ...

  10. 饼图tooltip

    @{ ViewBag.Title = "pie"; } <h2>pie</h2> <div id="main" style=&qu ...