2019牛客暑期多校训练营(第二场)H Second Large Rectangle
示例一:
输入 :
1 2
01
输出:
0
示例二:
输入 :
1 3
101
输出:
1
示例三(自己自测找错误用的):
输入 :
6 6
100111
111011
111111
111111
111111
101111
输出:
16
题意:在由1和0构成的矩形中找到由仅由1构成的第二大的矩形。(前缀和思维)
解题思路:(1)这是比赛后看别人代码的解法,比赛中自己也有这思路,但没考虑周到。运用前缀和思想算出每个位置前面到这个位置一共有多少个连续的1,然后从左上角开始往下算,每次记录当前位置的长度和位置(位置后面用来计算矩形的高度),每次算出当前最大矩形的大小和次大矩形的大小,更新答案。
(2)dfs,感觉自己剪枝做得不够好所以一直超时,还没想出如何不超时的剪枝方法,先留着,复杂度为O(N³),通过率为95%。
不说了,贴代码:
(1)AC代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+;
int a[maxn][maxn],max_1=,max_2=;///a数组记录每个位置的前缀和,max_1和max_2为最大和次大
char ss[maxn][maxn];
struct node
{
int num,ins;
}pp[maxn];///记录当前位置的长度和位置
void update(int summ)///更新最大值和次大值
{
if(summ>max_1){
swap(max_1,max_2);swap(summ,max_1);
}
else if(summ>max_2)swap(summ,max_2);
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++)
scanf("%s",ss[i]);
for(int i=;i<=n;i++){
for(int j=;j<m;j++){
if(ss[i][j]=='')a[i][j+]==;
else if(ss[i][j]=='')a[i][j+]=a[i][j]+;
}
}
for(int j=; j<=m; j++)
{
int r=;
for(int i=; i<=n; i++)
{
int book=i;
while(r&&pp[r].num>a[i][j]){
update((i-pp[r].ins)*pp[r].num);
update((i-pp[r].ins-)*pp[r].num);
book=min(book,pp[r].ins);
r--;
}
pp[++r]={a[i][j],book};
}
while(r){
update(((n+)-pp[r].ins)*pp[r].num);
update(((n+)-pp[r].ins-)*pp[r].num);
r--;
}
}
printf("%d\n",max_2);
return ;
}
(2)有剪枝通过的大佬教我一下
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+;
int a[maxn][maxn],max_1=,max_2=,t;///a数组记录每个位置的前缀和,max_1和max_2为最大和次大
int jlen=,ilen=,rec;///用于记录最小长度,最高高度和当前面积
char ss[maxn][maxn];
void dfs(int x,int y)
{
if(a[x][y])
{
if(a[x][y]>=jlen)
{
ilen++;
rec=ilen*jlen;
if(rec>max_1){
swap(max_1,max_2);swap(rec,max_1);}
else if(rec>max_2)
swap(rec,max_2);
dfs(x-,y);
}
else if(a[x][y]<jlen)
{
ilen++,jlen=a[x][y];
rec=ilen*jlen;
if(rec>max_1)
t=max_1,max_1=rec,max_2=t;
else if(rec>max_2)
max_2=rec;
dfs(x-,y);
}
}
return;
}
int main()
{
int n,m,x,book=;
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++){
scanf("%s",ss[i]);
for(int j=; j<m; j++)
{
if(j==&&ss[i][]=='')
a[i][]=,book++;
else if(ss[i][j]=='')
a[i][j+]=;
else if(ss[i][j]=='')
a[i][j+]=a[i][j]+,book++;
}
}
for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++)
{
if(a[i][j])
{
ilen=,jlen=a[i][j];
rec=ilen*jlen;
if(rec>max_1)
t=max_1,max_1=rec,max_2=t;
else if(rec>max_2)
max_2=rec;
dfs(i-,j);
}
}
}
printf("%d\n",max_2);
return ;
}
(3)上面代码改进深搜极限918msAC(PS:试了横着做和竖着做,发现就只有竖着做能A,可能数据太弱的缘故吧)
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+;
int a[maxn][maxn],max_1=,max_2=;
int rec;
int main()
{
int n,m,x,book=;
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++)
for(int j=; j<=m; j++)
{
scanf("%1d",&a[i][j]);
a[i][j]+=a[i-][j]*a[i][j];
}
for(int i=n; i>=; i--)
{
for(int j=m; j>=; j--)
{
if(i*j<=max_2)break;
int ilen=a[i][j],jlen=;
while(ilen)
{
rec=ilen*jlen;
if(rec>=max_1)
max_2=max_1,max_1=rec;
else if(rec>max_2)
max_2=rec;
ilen=min(ilen,a[i][j-jlen]);
jlen++;
}
}
}
printf("%d\n",max_2);
return ;
}
2019牛客暑期多校训练营(第二场)H Second Large Rectangle的更多相关文章
- 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)
题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...
- 2020牛客暑期多校训练营 第二场 K Keyboard Free 积分 期望 数学
LINK:Keyboard Free 我要是会正经的做法 就有鬼了. 我的数学水平没那么高. 三个同心圆 三个动点 求围成三角形面积的期望. 不会告辞. 其实可以\(n^2\)枚举角度然后算出面积 近 ...
- 2020牛客暑期多校训练营 第二场 J Just Shuffle 置换 群论
LINK:Just Shuffle 比较怂群论 因为没怎么学过 置换也是刚理解. 这道题是 已知一个置换\(A\)求一个置换P 两个置换的关键为\(P^k=A\) 且k是一个大质数. 做法是李指导教我 ...
- 2020牛客暑期多校训练营 第二场 I Interval 最大流 最小割 平面图对偶图转最短路
LINK:Interval 赛时连题目都没看. 观察n的范围不大不小 而且建图明显 考虑跑最大流最小割. 图有点稠密dinic不太行. 一个常见的trick就是对偶图转最短路. 建图有点复杂 不过建完 ...
- 2020牛客暑期多校训练营 第二场 C Cover the Tree 构造 贪心
LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 ...
- 2020牛客暑期多校训练营 第二场 B Boundary 计算几何 圆 已知三点求圆心
LINK:Boundary 计算几何确实是弱项 因为好多东西都不太会求 没有到很精通的地步. 做法很多,先说官方题解 其实就是枚举一个点 P 然后可以发现 再枚举一个点 然后再判断有多少个点在圆上显然 ...
- 2020牛客暑期多校训练营 第二场 A All with Pairs 字符串hash KMP
LINK:All with Pairs 那天下午打这个东西的时候状态极差 推这个东西都推了1个多小时 (比赛是中午考试的我很困 没睡觉直接开肝果然不爽 一开始看错匹配的位置了 以为是\(1-l\)和\ ...
- 2019牛客暑期多校训练营(第九场) D Knapsack Cryptosystem
题目 题意: 给你n(最大36)个数,让你从这n个数里面找出来一些数,使这些数的和等于s(题目输入),用到的数输出1,没有用到的数输出0 例如:3 4 2 3 4 输出:0 0 1 题解: 认真想一 ...
- [题解] 2019牛客暑期多校第三场H题 Magic Line
题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意:二维平面上有n个不同的点,构造一条直线把平面分成两个点数相同的部分. 题解:对这n个点以x为第一关键 ...
- 2020牛客暑假多校训练营 第二场 H Happy Triangle set 线段树 分类讨论
LINK:Happy Triangle 这道题很容易. 容易想到 a+b<x a<x<b x<a<b 其中等于的情况在第一个和第三个之中判一下即可. 前面两个容易想到se ...
随机推荐
- Reactive Extensions (Rx) 入门(2) —— 安装 Reactive Extensions
译文:https://blog.csdn.net/fangxing80/article/details/7581937 原文:http://www.atmarkit.co.jp/fdotnet/int ...
- kafka设计要点之高吞吐量
2345678910111213141516 /** * Delete this log segment from the filesystem. * * @throws KafkaStorageEx ...
- OpenVSwitch实验参考
1. 使用Floodlight管理OVS桥 (1) 下载:https://codeload.github.com/floodlight/floodlight/tar.gz/v1.2 (2) tar x ...
- 部署oVirt4.2+Gluster超融合架构
首先下载最新ovirt-node iso镜像 准备3台机器,配置为2核,16G内存,两块硬盘,1块100G装系统,1块300G做存储 node1.com(192.168.105.221) node2. ...
- ubuntu下Java通过JNI调用C
下面看一个实例,如下: public class TestJNI { static { System.loadLibrary("diaoyong"); // 程序在加载时,自动加载 ...
- mlocate比find快很多的查找命令
mlocate比find快很多的查找命令 使用linux操作系统的人,一般都用过文件查找命令find,在文件数量非常庞大的时候,比如在高通的android工程项目中,目录大小有十几个G,文件数量非常多 ...
- adb server version (31) doesn't match this client (41); killing...
1.有时候用adb工具去连接安卓设备,或者模拟器的时候,会提示adb server version(31) doesn’t match this client(41)这样的提示.如图 提示的字面意思就 ...
- Unity制作棋牌手游之斗地主
目录 大小7.2GB,MP4格式 扫码时备注或说明中留下邮箱 付款后如未回复请至https://shop135452397.taobao.com/ 联系店主
- python mysql数据库压力测试
python mysql数据库压力测试 pymysql 的执行时间对比 1,装饰器,计算插入1000条数据需要的时间 def timer(func): def decor(*args): start_ ...
- spring mvc aop拦截controller层获取RequestBody反序列化后参数
最近,为了解耦,把一逻辑从interceptor抽出来,放在aop中处理,需要得到RequestBody.如下: @Aspect @Configuration public class CheckAs ...