显然只需要考虑与障碍点相邻的格子,通过旋转坐标系,可以只考虑障碍点在格子上方的情况。

悬线法求出每个点往上的最长延伸距离$x$,以及往左往右的延伸距离$y$。

那么当$r\geq x$时,$c$至多为$y$。

特别地,当某个点下方也是障碍点的时候,$r$不能超过$x$。

维护出每个$r$对应的最大的$c$即可。

时间复杂度$O(nm)$。

#include<cstdio>
#include<algorithm>
const int N=2505;
int n,m,i,j,k,l[N],r[N],h[N],f[N],ans,pos;char a[N][N],b[N][N];
inline void up(int&a,int b){a>b?(a=b):0;}
void work(int n,int m,int rev){
int i,j,k,x,y;
for(i=1;i<=m;i++)l[i]=1,r[i]=m,h[i]=0,a[n+1][j]='_';
for(i=1;i<=n;i++){
for(j=k=1;j<=m;j++)if(a[i][j]=='X'){
h[j]++;
if(k>l[j])l[j]=k;
}else h[j]=0,l[j]=1,r[j]=m,k=j+1;
for(j=k=m;j;j--)if(a[i][j]=='X'){
up(r[j],k);
x=h[j],y=r[j]-l[j]+1;
if(rev){
up(f[y+1],x-1);
if(a[i+1][j]=='_')up(f[1],x);
}else{
up(f[x],y);
if(a[i+1][j]=='_')f[x+1]=0;
}
}else k=j-1;
}
}
int main(){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)scanf("%s",a[i]+1),f[i]=m;
for(i=0;i<4;i++){
work(n,m,i&1);
for(j=1;j<=n;j++)for(k=1;k<=m;k++)b[k][n-j+1]=a[j][k];
std::swap(n,m);
for(j=1;j<=n;j++)for(k=1;k<=m;k++)a[j][k]=b[j][k];
}
for(i=1;i<=n;i++){
if(i>1)up(f[i],f[i-1]);
if(i*f[i]>ans)ans=i*f[i],pos=i;
}
return printf("%d %d",pos,ans/pos),0;
}

  

BZOJ3736 : [Pa2013]Karty的更多相关文章

  1. BZOJ 3736: [Pa2013]Karty

    Description 一个0/1矩阵,求能覆盖所有 \(1\) ,同时不覆盖所有 \(0\) 的矩阵,使这个面积最大. Sol DP/悬线法. 首先,所求的矩阵一定可以覆盖所有贴边的悬线. 用悬线法 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. 【BZOJ3733】[Pa2013]Iloczyn (搜索)

    [BZOJ3733][Pa2013]Iloczyn (搜索) 题面 BZOJ 题解 把约数筛出来之后,直接爆搜,再随便剪枝就过了. 最近一句话题解倾向比较严重 #include<iostream ...

  4. 【BZOJ3837】[Pa2013]Filary 随机化神题

    [BZOJ3837][Pa2013]Filary Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等. 求出k的最大值,并求出此时 ...

  5. 【BZOJ3837】[PA2013]Filary

    [BZOJ3837][PA2013]Filary 题面 darkbzoj 题解 考虑到模数为\(2\)时答案至少为\(\frac n2\),这是我们答案的下界. 那么我们对于任意的一个数,它们答案集合 ...

  6. 【BZOJ】3737: [Pa2013]Euler

    题意: 求满足\(phi(a)=n\)的\(a\)的个数.(\(n \le 10^{10}\)) 分析 这种题一开始就感觉是搜索= = 题解 首先容易得到 \[\phi(n) = \prod_{i} ...

  7. BZOJ3733 : [Pa2013]Iloczyn

    首先将$n$的约数从小到大排序,设$dfs(x,y,z)$表示当前可以选第$x$个到第$m$个约数,还要选$y$个,之前选的乘积为$z$是否可能. 爆搜的时候,如果从$x$开始最小的$y$个相乘也超过 ...

  8. BZOJ3839 : [Pa2013]Działka

    对于每个询问,首先可以通过扫描线+线段树求出四个方向的第一个点,询问范围等价于框住这些点的最小矩形. 对于一个点$i$,预处理出: $A[i][j]$:$i$往左下角按凸壳走到$j$时,凸壳上相邻两点 ...

  9. BZOJ3838 : [Pa2013]Raper

    将选取的$A$看成左括号,$B$看成右括号,那么答案是一个合法的括号序列. 那么只要重复取出$k$对价值最小的左右括号,保证每时每刻都是一个合法的括号序列即可. 将$($看成$1$,$)$看成$-1$ ...

随机推荐

  1. FATAL Fatal error during KafkaServerStable startup. Prepare to shutdown (kafka.server.KafkaServerStartable) java.io.FileNotFoundException: /tmp/kafka-logs/.lock (Permission denied)

    1.启动kafka的时候,报错如下所示: [-- ::,] INFO zookeeper state changed (SyncConnected) (org.I0Itec.zkclient.ZkCl ...

  2. Centos7编译安装GCC7.2

    通常编译的时候可能需要新版本的gcc,本文就说明下基于低版本的gcc升级为gcc7.2 wget 'http://mirrors-usa.go-parts.com/gcc/releases/gcc-7 ...

  3. (1).NET CORE微服务 Micro-Service ---- 什么是微服务架构,.netCore微服务选型

    开发工具:VS2017 .Net Core 2.1 什么是微服务?单体结构: 缺点:1)只能采用同一种技术,很难用不同的语言或者语言不同版本开发不同模块:2)系统耦合性强,一旦其中一个模块有问题,整个 ...

  4. ionic2/cordova自定义插件集成aar包

    一.准备自定义插件 1. 准备:安装plugman npm install -g plugman 2. 新建组件 plugman create --name MyPlugin --plugin_id ...

  5. 大数据-kafka

    1Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 作用:1发布和订阅消息流,这个功能类似于消息队列,这也是kafka归类为消息队列框架的原因 2以容错 ...

  6. Python学习(二十九)—— pymysql操作数据库优化

    转载自:http://www.cnblogs.com/liwenzhou/articles/8283687.html 我们之前使用pymysql操作数据库的操作都是写死在视图函数中的,并且很多都是重复 ...

  7. Python学习(二十六)—— Django基础一

    转载自:http://www.cnblogs.com/liwenzhou/p/8258992.html 一.Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的 ...

  8. Python学习(十二) —— 面向对象

    一.初识面向对象 面向过程的核心是过程,流水线思维,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点:极大地降低了写程序的复杂度,只需要顺着要执行的 ...

  9. Codeforces 1101F Trucks and Cities dp (看题解)

    Trucks and Cities 一个很显然的做法就是二分然后对于每个车贪心取check, 这肯定会TLE, 感觉会给人一种贪心去写的误导... 感觉有这个误导之后很难往dp那个方向靠.. dp[ ...

  10. 070 DStream中的transform和foreachRDD函数

    1.说明 DStream的API不够满足使用的时候,可以使用这两个函数,将dstream转换为rdd,然后进行操作 2.transform transform:将DStream的操作转换为RDD的操作 ...