2019牛客暑期多校训练营(第二场)H——Second Large Rectangle(思维题,求第二大全1矩阵)

链接:https://ac.nowcoder.com/acm/contest/882/H
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

Given a N×MN×M binary matrix. Please output the size of second large rectangle containing all "1""1".

Containing all "1""1" means that the entries of the rectangle are all "1""1".
 

A rectangle can be defined as four integers x1,y1,x2,y2x1,y1,x2,y2 where 1≤x1≤x2≤N1≤x1≤x2≤N and 1≤y1≤y2≤M1≤y1≤y2≤M. Then, the rectangle is composed of all the cell (x, y) where x1≤x≤x2x1≤x≤x2 and y1≤y≤y2y1≤y≤y2. If all of the cell in the rectangle is "1""1", this is a valid rectangle.

 

Please find out the size of the second largest rectangle, two rectangles are different if exists a cell belonged to one of them but not belonged to the other.

输入描述:


 

The first line of input contains two space-separated integers N and M.
Following N lines each contains M characters cijcij.

1≤N,M≤10001≤N,M≤1000
N×M≥2N×M≥2
cij∈"01"cij∈"01"

输出描述:


 

Output one line containing an integer representing the answer. If there are less than 2 rectangles containning all "1""1", output "0""0".

示例1

输入

复制

1 2
01

输出

复制

0

示例2

输入

复制

1 3
101

输出

复制

1

题意:求第二大全1矩阵

题解:用dp[i][j]表示这个位置,往上延伸最多有多少个连续的1,结构体存的是矩形的高 和 宽的左边坐标,然后暴力一行一行找~~

感觉会超时,结果没超时,还贼快~~

上代码:(此代码max1是第一大,max2是第二大,所以第一大,第二大都能求~~哈哈~~)

#include <iostream>
using namespace std;
const int MAX = 1e3+400;
int max1,max2,top;//max1是第一大的值,max2是第二大的值
struct hh{
	int l,h;
	hh(int _l=0,int _h=0):l(_l),h(_h){}
}q[MAX];
int dp[MAX][MAX],s[MAX][MAX];
void update(int x){
	if(x>=max1){
		max2=max1;
		max1=x;
	}
	else if(x>max2){
		max2=x;
	}
}
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for (int i = 1; i <= n;i++){
		for (int j = 1; j <= m;j++){
			scanf("%1d",&dp[i][j]);
			s[i][j]=dp[i][j];
			dp[i][j]+=dp[i][j]*dp[i-1][j];//保存向上延伸最多有多少个1
		}
	}
	for (int i = 1; i <= n;i++){
		top=0;
		for (int j = 1; j <= m;j++){
			if(s[i][j]==0) top=0;//有一个是0,就要重新开始找,前面无法再包括进去,只能往后找
			else{
				int tmp=j;
				while(q[top].h>dp[i][j]&&top) tmp=q[top--].l;//找到宽符合是全1矩阵的位置
				if(q[top].h!=dp[i][j]) q[++top]=hh(tmp,dp[i][j]);
				for (int k = 1; k <= top;k++){
					update(q[k].h*(j-q[k].l+1));//更新最大、第二大的值
				}
			}
		}
	}
	printf("%d\n",max2);//输出第二大的值
	return 0;
} 

 

全部评论

相关推荐

头像
2025-12-02 21:34
中南大学 Java
我这边应该算是华为第一批开奖的了,还是要11月底才开,不过今年的流程整体比去年确实要开得早,这一点还是值得表扬的。然后华为也确实很有诚意,给我这样bg的硕鼠开了15a,并且base地还是在杭州,应该是buff拉满了,但凡其他公司开的没这个高,and对象没签上海,可能真选择成为华孝子了。虽然很有诱惑力,但是这个15a的offer里面确实还是有猫腻的:1.&nbsp;薪资构成是这样的,15a&nbsp;=&nbsp;(基本工资+绩效工资)*12&nbsp;+&nbsp;10w年终,虽然绩效工资hr说100%能拿满,年终大部分都能拿满,绩效工资能拿满我可能还选择相信,但10w年终还能拿满,这我就存疑了。反正看了一圈别家的公司报价都是报一般情况下能拿多少年终,比如美团0-6个月,就报3.5个月,但是华似乎是喜欢往最高了报,所以估计10w年终拿满应该也是极少数人。2.&nbsp;公积金只交5%,并且缴纳基数还只是按基本工资交的,这里看似每个月到手的钱变多了,但是总体算下来,可能一年比别家就少拿1-2w。3.&nbsp;月末周六要加班,可以选择调休或双倍加班费,并且平常应该也会加班,感觉不大会像hr说的124能8.30下班,35能5.30下班的,云计算bu强度应该还算比较好的,估计一般情况下9-9-5吧,但是不知道并入ict后会如何。4.&nbsp;还有相关的业务线,听说8,9月份云计算bu内部已经调整了一波,好像还要并入ict下面了,感觉未来的不确定性也比较大。5.&nbsp;华为的认可度应该比不过传统的互联网大厂,技术的前瞻性应该也比不过(个人看法)。6.&nbsp;培养和升职,感觉美团可能更有说法,毕竟见到过1年升L6的,甚至还有两年升L7的,对华为的了解相对较少,只知道华为可能相对稳定一些?毕竟4年一签?综上,还是决定放弃华,准备去团吧,自己选的路,希望不会后悔吧。
变形钢筋:这个薪资结构,年终奖是画大饼啊
OC/开奖
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务