zoukankan      html  css  js  c++  java
  • 19牛客暑期多校 round2 H 01矩阵内第二大矩形

    题目传送门//res tp nowcoder

    目的

    给定n*m 01矩阵,求矩阵内第二大矩形

    分析

    O(nm)预处理01矩阵为n个直方图,问题转换为求n个直方图中的第二大矩形。单调栈计算,同时维护前二大的面积即可。
    对于X*Y的矩阵,我们只需考虑X * Y,X * (Y-1),(X-1) * Y即可

    #include<iostream>
    #include<algorithm>
    #include<stack>
    using namespace std;
    typedef long long ll;
    const int L = 1010;
    ll max1,max2;
    
    
    inline void Update(ll x,ll y){
    	ll t = x*y;
    	if(t<max2)return;
    	else if(t<max1) max2 = t;
    	else{
    		max2 = max1;max1 = t;
    	} 
    }
    inline void update(ll x,ll y){
    	Update(x,y);
    	Update(x,y-1);
    	Update(x-1,y);
    }
    
    void Maxrectangle(ll H[],int n){
    	stack<int>M;
    	for(int k = 1;k<=n;){
    		if(M.empty()||H[M.top()] <=H[k])
    			M.push(k++);
    		else{
    			ll h = H[M.top()];M.pop();
    			if(M.empty())
    				update((k-1),h);
    			else
    				update((k-M.top()-1),h);
    		}
    	}
    	while(!M.empty()){
    		ll h = H[M.top()];M.pop();
    		if(M.empty())
    			update(n,h);
    		else
    			update((n-M.top()),h);
    	}
    }
    
    int n,m;
    char s[L][L];
    ll num[L][L];
    int main(){
    	cin>>n>>m;
    	for(int i = 1;i<=n;++i) cin>>s[i];
    	for(int j = 1;j<=m;++j)for(int i = 1;i<=n;++i){
    		if(s[i][j-1] == '0') num[i][j] = 0;
    		else if(s[i][j-1] == '1') num[i][j] = num[i-1][j] + 1;
    		else num[i][j] = 0;
    	}
    	for(int i = 1;i<=n;++i) Maxrectangle(num[i],m);
    	cout<<max2<<endl;
    	
    }
    
    
  • 相关阅读:
    mybatis plus foreach 的用法
    mongodb聚合查询
    mongodb and 和 or 查询
    mongodb全文搜索
    时间参数的传递
    rabbitmq
    AOP各种的实现
    OWASP Top 10十大风险 – 10个最重大的Web应用风险与攻防
    OAuth2.0认证和授权机制讲解
    MySQL主从复制
  • 原文地址:https://www.cnblogs.com/tea-egg/p/11269144.html
Copyright © 2011-2022 走看看