一个地图上有若干障碍,问允许出现一个障碍的最大子矩形为多大?

最大子矩形改编

#include<bits/stdc++.h>
using namespace std;
#define rep(i, j, k) for (int i = int(j); i <= int(k); ++ i)
#define dwn(i, j, k) for (int i = int(j); i >= int(k); -- i)
const int N = ;
int n, m, l[N][], r[N][], h[N][];
char s[N][N]; int main() {
scanf("%d%d", &n, &m);
rep(i, , n) scanf("%s", s[i] + );
int ans = ;
// 枚举障碍不在悬线上
// l[j][0]表示最左扩展(不能包含障碍),l[j][1]表示最右扩展(能包含障碍)
rep(j, , m) l[j][] = l[j][] = j, r[j][] = r[j][] = m + - j;
rep(i, , n) {
int lb0 = , lb1 = ;
rep(j, , m) {
if (s[i][j] == '.') {
h[j][] ++; ans = max(ans, h[j][]);
l[j][] = max(min(l[j][], j - lb0), min(l[j][], j - lb1));
l[j][] = min(l[j][], j - lb0);
}
else {
lb1 = lb0;
lb0 = j;
l[j][] = l[j][] = j;
h[j][] = ;
}
}
int rb0 = m + , rb1 = m + ;
dwn(j, m, ) {
if (s[i][j] == '.') {
r[j][] = max(min(r[j][], rb0 - j), min(r[j][], rb1 - j));
r[j][] = min(r[j][], rb0 - j);
ans = max(ans, (l[j][] + r[j][] - ) * h[j][]);
ans = max(ans, (l[j][] + r[j][] - ) * h[j][]);
ans = max(ans, (l[j][] + r[j][] - ) * h[j][]);
}
else {
rb1 = rb0;
rb0 = j;
r[j][] = r[j][] = m + - j;
}
}
}
// 枚举障碍在悬线上
// 这时候的l[j][0]表示没有障碍的悬线最左扩展,l[j][1]表示有障碍的悬线最左扩展
rep(j, , m) l[j][] = l[j][] = j, r[j][] = r[j][] = m + - j, h[j][] = h[j][] = ;
rep(i, , n) {
int lb = ;
rep(j, , m) {
if (s[i][j] == '.') {
h[j][] ++; h[j][] ++;
l[j][] = min(l[j][], j - lb);
l[j][] = min(l[j][], j - lb);
}
else {
l[j][] = min(l[j][], j - lb);
h[j][] = h[j][] + ; h[j][] = ;
l[j][] = j;
lb = j;
}
}
int rb = m + ;
dwn(j, m, ) {
if (s[i][j] == '.') {
r[j][] = min(r[j][], rb - j);
r[j][] = min(r[j][], rb - j);
}
else {
r[j][] = min(r[j][], rb - j);
r[j][] = m + - j;
rb = j;
}
}
rep(j, , m) {
ans = max(ans, h[j][] * (l[j][] + r[j][] - ));
}
}
cout << ans << '\n';
}
/*
4 5
#.#..
....#
..#..
....#
*/

Petrozavodsk Winter Camp, Warsaw U, 2014, A The Carpet的更多相关文章

  1. Petrozavodsk Winter Camp, Day 8, 2014, Ship

    $dp(i,j)$表示i-j这段还没运走时的状态,包括 运输了多少次,还剩多少空间 每次枚举运输左边还是右边转移 #include <bits/stdc++.h> #define rep( ...

  2. Petrozavodsk Winter Camp, Day 8, 2014, Fine Brochures

    1的个数-块的个数+多减的个数+flag 多减的只会在一个循环末尾出现 #include <bits/stdc++.h> using namespace std; #define rep( ...

  3. Petrozavodsk Winter Camp, Day 8, 2014, Second Trip

    给你一棵树,每次询问一个(a,b),问有多少有路径与a-b没有交集 找lca #include <bits/stdc++.h> using namespace std; #define r ...

  4. Petrozavodsk Winter Camp, Day 8, 2014, Mosaic

    给你三个数字a,b,c,让你用1-m的数字凑出来 结论:有2个1和2个2肯定凑不出来,然后就搜索 #include <bits/stdc++.h> using namespace std; ...

  5. Petrozavodsk Winter Camp, Day 8, 2014, Rectangle Count

    给一个n*m的格点图,问其中有多少个矩形? $ \sum_{x=1}^{nm} \sum_{ab=x} [a + b \leq n](n - a - b + 1)\sum_{cd=x} [c + d ...

  6. Petrozavodsk Winter Camp, Andrew, 2014, Dichromatic Trees

    条件: 1:每个红色节点的儿子都是黑色节点 2.每个叶子到根路径上的黑点数相等,等于某个常数,称作树的black height 求给定black height和节点数的符合条件的方案数 $black_ ...

  7. Petrozavodsk Winter Camp, Andrew, 2014, Bipartite Bicolored Graphs

    由i个点和j个点组成的二分图个数为 $3^{ij}$,减去不联通的部分得到得到由i,j个点组成的联通二分图个数 $g_{i,j} = 3_{ij} - \sum_{k=1}^i \sum_{l=0}^ ...

  8. 2018 Petrozavodsk Winter Camp, Yandex Cup

    A. Ability Draft solved by RDC 60min start, 148 min AC, 1Y 题意:两只 Dota 队伍,每队 \(n\) 个英雄,英雄一开始无技能,他们需要按 ...

  9. 2019 Petrozavodsk Winter Camp, Yandex Cup C. Diverse Singing 上下界网络流

    建图一共建四层 第一层为N个歌手 第二层为{pi,li} 第三层为{si,li} 第四层为M首歌 除了S和第一层与第三层与T之间的边为[1,INF] 其他边均为[0,1] #include<bi ...

随机推荐

  1. P3974 [TJOI2015]组合数学

    题目描述 为了提高智商,ZJY开始学习组合数学.某一天她解决了这样一个问题:给一个网格图,其中某些格子有财宝.每次从左上角出发,只能往右或下走.问至少要走几次才可能把财宝全捡完. 但是她还不知足,想到 ...

  2. requests库

    还没整理,先贴俩链接. https://www.cnblogs.com/lilinwei340/p/6417689.html http://docs.python-requests.org/zh_CN ...

  3. centos7安装git

    1.安装git依赖包 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUti ...

  4. mika的模板库

    二分图最大匹配: 1.匈牙利算法:注意dfs中是dfs(c[w[i]]),搜索的是与之匹配的点. #include<cstdio> #include<cstring> ],w[ ...

  5. vivo Xplay 5的Usb调试模式在哪里,打开vivo Xplay 5Usb调试模式的经验

    在我们使用安卓手机链接PC的时候,如果手机没有开启Usb调试模式,PC则无办法成功检测到我们的手机,部分app也无办法正常使用,因此我们需要找处理方法将手机的Usb调试模式开启,如下内容我们介绍viv ...

  6. Oarcle之事务

    update:更新 例如转账: update emp_ temp set sal = sal-500 where ename = 'JONES':(更新表中sal项 为sal-500 是当ename= ...

  7. 创建我的vue项目

    vue-cli 全局安装 1.命令行执行:npm install --global vue-cli: ------也可以用这个命令下载新版本 2.安装完成以后 可以输入命令 :vue 回车,可以看到针 ...

  8. 远程执行shell脚本的小技巧

    很多时候需要批量跑脚本执行任务,但又不想分发再执行,而是直接一条命令下去就跑脚本,该怎么玩比较嗨? 例如以下脚本: #!/bin/bash echo "$@" echo " ...

  9. 创建局域网yum服务器

    首先需要安装createrepo这个软件包,使用yum安装即可 创建软件库文件夹,比如mkdir -p /var/www/html/myrepo/x86_64, 将软件包拷贝到文件夹下. cd到该文件 ...

  10. 单例模式-懒汉式的一次多线程Debug

    单例模式要要点就是一个类只会存在一个实例,要想达到这种效果,最重要的就是将构造方法设置为私有,然后通过static的方法来获取对象. 上述设计并不线程安全,因为在lazySingleton = new ...