• poj2082单调栈


    本来实在做后缀数组的题目的,不巧,碰到了pku3415这题,需要用到单调栈来维护,但是之前又没有学习过单调栈这方面的知识,于是水了几题.......

    题意:给你一些连续的小矩形,高宽不定,求最大的矩形面积........

    思路:直接用单调栈,当有一个矩形的高小于等于栈顶元素的高时,出栈,并维护这个即将入栈的元素的向前延伸的宽度范围,维护出栈后的栈顶元素向后延伸的宽度范围.......

    #include<iostream>
    #include<stack>
    #include<stdio.h>
    using namespace std;
    struct node
    {
    	__int64 h,pre,next,w;
    };
    int main()
    {
    	int n;
    	while(scanf("%d",&n)>0)
    	{
    		if(n==-1)
    		break;
    		stack<node>Q;
    		node tmp;
    		__int64 ans=0,sum=0,num;
    		scanf("%I64d%I64d",&tmp.w,&tmp.h);
    		tmp.pre=tmp.w;
    		tmp.next=tmp.w;
    		Q.push(tmp);
    		for(int i=1;i<n;i++)
    		{
    			scanf("%I64d%I64d",&tmp.w,&tmp.h);
    			tmp.pre=tmp.next=tmp.w;
    			while(!Q.empty()&&tmp.h<=Q.top().h)
    			{
    				node tmp1=Q.top();
    				Q.pop();
    				ans=tmp1.h*(tmp1.pre+tmp1.next-tmp1.w);
    				if(!Q.empty())
    				Q.top().next+=tmp1.next;
    				tmp.pre+=tmp1.pre;
    				if(ans>sum)
    				sum=ans;
    			}
    			Q.push(tmp);
    		}
    		while(!Q.empty())
    		{
    			node tmp1=Q.top();
    			Q.pop();
    			if(!Q.empty())
    			Q.top().next+=tmp1.next;
    			ans=tmp1.h*(tmp1.pre+tmp1.next-tmp1.w);
    			if(ans>sum)
    			sum=ans;
    		}
    		printf("%I64d
    ",sum);
    	}
    	return 0;
    } 
    
  • 相关阅读:
    行内块 块级元素 行内元素
    3种飞翼布局
    emmit
    Linux基础命令
    关于微信小程序下拉出现三个小点
    关于vue,angularjs1,react之间的对比
    微信小程序开发遇见的问题之一
    关于微信小程序的尺寸关系
    关于微信小程序的开发步骤
    关于前端基础知识的一些总结
  • 原文地址:https://www.cnblogs.com/ziyi--caolu/p/3151505.html
Copyright © 2020-2023  润新知