2018.09.29 bzoj3885: Cow Rectangles(悬线法+二分)
传送门
对于第一个问题,直接用悬线法求出最大的子矩阵面积,然后对于每一个能得到最大面积的矩阵,我们用二分法去掉四周的空白部分来更新第二个答案。
代码:
#include<bits/stdc++.h>
#define M 1005
using namespace std;
int n,x,y,a[M][M],b[M][M],L[M][M],R[M][M],h[M][M],sum[M][M],lpos[M][M],rpos[M][M],ans1=0,ans2=0;
char s[4];
inline int calc(int x1,int y1,int x2,int y2){return sum[x2][y2]+sum[x1-1][y1-1]-sum[x2][y1-1]-sum[x1-1][y2];}
inline int solve(int x1,int y1,int x2,int y2){
int l=x1,r=x2,ans=l,tmp=calc(x1,y1,x2,y2);
while(l<=r){
int mid=l+r>>1;
if(calc(mid,y1,x2,y2)==tmp)l=mid+1,ans=mid;
else r=mid-1;
}
x1=ans,l=x1,r=x2;
while(l<=r){
int mid=l+r>>1;
if(calc(x1,y1,mid,y2)==tmp)r=mid-1,ans=mid;
else l=mid+1;
}
x2=ans,l=y1,r=y2,ans=y1;
while(l<=r){
int mid=l+r>>1;
if(calc(x1,mid,x2,y2)==tmp)l=mid+1,ans=mid;
else r=mid-1;
}
y1=ans,l=y1,r=y2,ans=y2;
while(l<=r){
int mid=l+r>>1;
if(calc(x1,y1,x2,mid)==tmp)r=mid-1,ans=mid;
else l=mid+1;
}
y2=ans;
return (x2-x1)*(y2-y1);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d%d%s",&x,&y,s),s[0]=='H'?a[x+1][y+1]=1:b[x+1][y+1]=1;
n=1001;
for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)sum[i][j]=sum[i-1][j]+sum[i][j-1]+a[i][j]-sum[i-1][j-1];
for(int i=1;i<=n;++i){
int ltmp=0,rtmp=n;
for(int j=1;j<=n;++j){
if(b[i][j])ltmp=j+1;
else L[i][j]=ltmp;
}
for(int j=n;j;--j){
if(b[i][j])rtmp=j-1;
else R[i][j]=rtmp;
}
for(int j=1;j<=n;++j){
if(b[i][j])continue;
h[i][j]=h[i-1][j]+1;
if(!(h[i][j]^1))lpos[i][j]=L[i][j],rpos[i][j]=R[i][j];
else lpos[i][j]=max(L[i][j],lpos[i-1][j]),rpos[i][j]=min(R[i][j],rpos[i-1][j]);
int tmp1=calc(i-h[i][j]+1,lpos[i][j],i,rpos[i][j]),tmp2=solve(i-h[i][j]+1,lpos[i][j],i,rpos[i][j]);
if(tmp1>ans1)ans1=tmp1,ans2=tmp2;
else if(tmp1==ans1)ans2=min(ans2,tmp2);
}
}
printf("%d\n%d",ans1,ans2);
return 0;
}
2018.09.29 bzoj3885: Cow Rectangles(悬线法+二分)的更多相关文章
- 2018.09.29 bzoj3039: 玉蟾宫(悬线法)
传送门 悬线法的板子题. 悬线法只需要保存当期点向下最多多少个,把这个当成一条线,再处理出线绷直之后最多能向左右延展多少就行了. 代码: #include<bits/stdc++.h> # ...
- 2018.10.19 bzoj1057: [ZJOI2007]棋盘制作(悬线法)
传送门 悬线法板题. 如果只求最大矩形面积那么跟玉蟾宫是一道题. 现在要求最大正方形面积. 所以每次更新最大矩形面积时用矩形宽的平方更新一下正方形答案就行了. 代码: #include<bits ...
- DP(悬线法)【P1169】 [ZJOI2007]棋盘制作
顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述-->p1169 棋盘制作 题目大意 给定一个01棋盘,求其中01交错的最大正方形与矩形. 解题思路: 动态规划---悬线法 以下内 ...
- 【BZOJ-1127】KUP 悬线法 + 贪心
1127: [POI2008]KUP Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 317 Solved: 11 ...
- 【BZOJ-3039&1057】玉蟾宫&棋盘制作 悬线法
3039: 玉蟾宫 Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 753 Solved: 444[Submit][Status][Discuss] D ...
- BZOJ_3039_玉蟾宫_(动态规划+悬线法)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3039 n*m的矩阵由R和F组成,求全是F的子矩阵的大小的三倍. 分析 悬线法: 浅谈用极大化思 ...
- BZOJ 1057: [ZJOI2007]棋盘制作( dp + 悬线法 )
对于第一问, 简单的dp. f(i, j)表示以(i, j)为左上角的最大正方形, f(i, j) = min( f(i + 1, j), f(i, j + 1), f(i + 1, j + 1)) ...
- BZOJ 3039: 玉蟾宫( 悬线法 )
最大子矩阵...悬线法..时间复杂度O(nm) 悬线法就是记录一个H向上延伸的最大长度(悬线), L, R向左向右延伸的最大长度, 然后通过递推来得到. ----------------------- ...
- [POJ1964]City Game (悬线法)
题意 其实就是BZOJ3039 不过没权限号(粗鄙之语) 同时也是洛谷4147 就是求最大子矩阵然后*3 思路 悬线法 有个博客讲的不错https://blog.csdn.net/u012288458 ...
随机推荐
- Oracle12c部署
部署环境业务系统与数据库服务部署在一台服务器上了 电脑是台式机没有网络,也没有插网线,需要先建立一个网络回环,然后进行Oracle12c的安装,安装过程中系统会默认勾选创建为容器数据库,需要把这个勾选 ...
- LInux下LD_LIBRARY_PATH的作用与设置
LD_LIBRARY_PATH环境变量主要是用于指定动态链接器(Id)超早elf可执行文件运行时所依赖的动态库(so)的路径,其内容是以冒号分隔的路径列表. Id链接器优先在该变量设置的路径中查找,若 ...
- cmd 查看本地端口被占用程序
netstat -ano 列出当前活动的网络连接 参数:-a所有侦听端口 -n以数字格式显示地址和端口号 -o显示进程号 tasklist|find "8888" 找出占用888 ...
- ArrayList 原理(1)
ArrayList是Java List类型的集合类中最常使用的,本文基于Java1.8,对于ArrayList的实现原理做一下详细讲解. (Java1.8源码:http://docs.oracle.c ...
- top命令之你不一定懂的cpu显示信息
%st(Steal time) 是当 hypervisor 服务另一个虚拟处理器的时候,虚拟 CPU 等待实际 CPU 的时间的百分比. ------------------------------- ...
- Docker之My sql 之旅
要用到mysql 数据库,本来想在本机装,后来想想还是有点污染环境,既然有docker为什么不用呢? 于是开启了采坑之旅,与其说采坑,倒不如说看文档不仔细看. docker pull mysql:5. ...
- EXCEL保存提示“隐私问题警告:此文档中包含宏……”解决办法
先点击“禁止宏运行”的那个按钮.打开文件后,按alt + F11 进入宏编辑器,在“工程”里查看是什么宏.如果是你需要的,就留着.否则右击这个宏名称,选择“移除”. 另外,如果是你需要的,还需要在 工 ...
- Spring boot集成 MyBatis 通用Mapper
配置 POM文件 <parent> <groupId>org.springframework.boot</groupId> <artifactId>sp ...
- function方法控制是否隐藏部分内容
$(document).ready(function() { $('input[type=radio][name=IE]').change(function() { if (this.value == ...
- Python3 open() 函数
Python3 open() 函数 Python3 内置函数 Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 ...