【专题】单调栈
弄个单调递增栈扫一遍,然后每次出栈更新一下答案,再记录一下最小的坐标传给进栈元素就好啦。别忘了开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 }
未完...

浙公网安备 33010602011771号