【专题】单调栈

poj2559

弄个单调递增栈扫一遍,然后每次出栈更新一下答案,再记录一下最小的坐标传给进栈元素就好啦。别忘了开LL...

(好像这题还能dp

 1 #include<cstdio>
 2 #define N 100010
 3 #define repu(i,x,y) for(i=x;i<=y;i++)
 4 #define min(a,b) (a<b?a:b)
 5 #define LL long long
 6 int a[N],s[N],x=0;
 7 LL h[N];
 8 LL max(LL a,LL b) {return a>b?a:b;}
 9 int main() {
10     while (1) {
11         int i,n,t; scanf("%d",&n); if (!n) return 0;
12         LL ans=0;
13         repu(i,1,n) scanf("%d",&a[i]); a[n+1]=0;
14         repu(i,1,n+1) {
15             t=i;
16             while (x>0&&a[i]<=h[x]) ans=max(ans,h[x]*(i-s[x])),t=min(t,s[x]),x--;
17             ++x,s[x]=t,h[x]=a[i];
18         }
19         printf("%I64d\n",ans);
20     }
21 }
View Code

 

未完...

posted @ 2017-06-17 09:40  lxtx  阅读(242)  评论(0)    收藏  举报