标签:
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
#include<bits/stdc++.h> using namespace std; #define ll long long #define mod 100000007 #define esp 0.00000000001 const int N=1e5+10,M=1e6+10,inf=1e9+10; ll sum[N<<2]; ll a[N<<2]; int d[N]; int l[N]; int r[N]; ll ans[N]; void build(int l,int r,int pos) { if(l==r) { sum[pos]=a[l]; return; } int mid=(l+r)>>1; build(l,mid,pos<<1); build(mid+1,r,pos<<1|1); sum[pos]=max(sum[pos<<1],sum[pos<<1|1]); } ll query(int L,int R,int l,int r,int pos) { if(L<=l&&R>=r) return sum[pos]; int mid=(l+r)>>1; ll ans=0; if(R>mid)ans=max(ans,query(L,R,mid+1,r,pos<<1|1)); if(L<=mid)ans=max(ans,query(L,R,l,mid,pos<<1)); return ans; } int main() { int x,y,z,i,t; while(~scanf("%d",&x)) { memset(ans,0,sizeof(ans)); for(i=1;i<=x;i++) scanf("%I64d",&a[i]); build(1,x,1); a[0]=a[x+1]=0; int k=0; d[++k]=0; for(i=1;i<=x;i++) { while(a[d[k]]>=a[i])k--; l[i]=d[k]; d[++k]=i; } k=0; d[++k]=x+1; for(i=x;i>=1;i--) { while(a[d[k]]>=a[i])k--; r[i]=d[k]; d[++k]=i; } for(i=1;i<=x;i++) ans[r[i]-l[i]-1]=max(ans[r[i]-l[i]-1],(ll)query(l[i]+1,r[i]-1,1,x,1)*a[i]); for(i=x-1;i>=1;i--) ans[i]=max(ans[i],ans[i+1]); for(i=1;i<=x;i++) printf("%I64d\n",ans[i]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/jhz033/p/5664669.html