19牛客暑期多校第二场H(单调栈)

求只有0和1的矩阵中第二大的全1子矩阵的1的个数

题解:单调栈求最大子矩阵 与这道题一样(板子)https://www.cnblogs.com/Kv-Stalin/p/9164705.html(特别详细),唯一不同就是最后要求的结果不同,所以有了代码中的去重部分,因为在处理每一行通过单调栈算矩形面积时,会重复算一个矩形面积好多次放在优先队列里,为避免这个才有了去重部分。

#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<stack>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1005;
int a[maxn][maxn];
int c[maxn][maxn];
int maxx,cnt;
int n,m;
int fun(int x,int y){
	if(x>n) return 0;
	if(c[x][y]==1){
	    a[x][y]=1;
	}
	fun(x+1,y);
	if(a[x][y])
	a[x][y]+=a[x+1][y];
	return a[x][y];	
}
int l[maxn];
int r[maxn];
priority_queue<int>q;
void gofun(int x){
	stack<int> s;
	for(int i=0;i<1005;i++)
		l[i]=r[i]=0;
	while(!s.empty()) s.pop();
	for(int i=1;i<=m;i++){//单增栈 找左边第一个小于的数 
		while(!s.empty()&&a[x][s.top()]>=a[x][i]) s.pop();
		if(s.empty()) l[i]=1;
		else l[i]=s.top()+1;
		s.push(i);
	}
	while(!s.empty()) s.pop();
	for(int i=m;i>=1;i--){//找右边第一个小于的数 从后往前找 依旧单增栈 
	   	while(!s.empty()&&a[x][s.top()]>=a[x][i]) s.pop();
		if(s.empty()) r[i]=m;
		else r[i]=s.top()-1;
		s.push(i);	
	}
	for(int i=1;i<=m;i++){
		int area=a[x][i]*(r[i]-l[i]+1);
		if(area>maxx){//去重 
	       cnt=0;
	       maxx=area;
		   for(int j=l[i];j<=r[i];j++){//遍历同底
		   	    if(a[x][i]==a[x][j])//找同高
		   	  	cnt++;
		   }
		}
		q.push(area);
		q.push(max(a[x][i]*(r[i]-l[i]),(a[x][i]-1)*(r[i]-l[i]+1)));
		//这里直接把每个矩形的去掉一列或去掉一行的矩形面积算出来放优先队列
	}
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
    	for(int j=1;j<=m;j++){
    		char ch;
    		cin>>ch;
    		if(ch=='1') c[i][j]=1;
    		else c[i][j]=0;
		}
	}
	for(int i=1;i<=m;i++){
		fun(1,i);
	}
	for(int i=1;i<=n;i++){
		gofun(i);
	}
	while(!q.empty()){
		q.pop();
		cnt--;
		if(cnt==0) break;
	} 
	if(!q.empty()) cout<<q.top()<<endl;
	else cout<<0<<endl;
	
	return 0;
} 

 

根据原作 https://pan.quark.cn/s/0ed355622f0f 的源码改编 野火IM解决方案 野火IM是专业级即时通讯和实时音视频整体解决方案,由北京野火无限网络科技有限公司维护和支持。 主要特性有:私有部署安全可靠,性能强大,功能齐全,全平台支持,开源率高,部署运维简单,二次开发友好,方便与第三方系统对接或者嵌入现有系统中。 详细情况请参考在线文档。 主要包括一下项目: 野火IM Vue Electron Demo,演示如何将野火IM的能力集成到Vue Electron项目。 前置说明 本项目所使用的是需要付费的,价格请参考费用详情 支持试用,具体请看试用说明 本项目默认只能连接到官方服务,购买或申请试用之后,替换,即可连到自行部署的服务 分支说明 :基于开发,是未来的开发重心 :基于开发,进入维护模式,不再开发新功能,鉴于已经终止支持且不再维护,建议客户升级到版本 环境依赖 mac系统 最新版本的Xcode nodejs v18.19.0 npm v10.2.3 python 2.7.x git npm install -g node-gyp@8.3.0 windows系统 nodejs v18.19.0 python 2.7.x git npm 6.14.15 npm install --global --vs2019 --production windows-build-tools 本步安装windows开发环境的安装内容较,如果网络情况不好可能需要等较长时间,选择早上网络较好时安装是个好的选择 或参考手动安装 windows-build-tools进行安装 npm install -g node-gyp@8.3.0 linux系统 nodej...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值