本来实在做后缀数组的题目的,不巧,碰到了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; }