话说正解是单调栈优化DP,然而貌似根据某种玄学的推算,这个题暴力出解貌似也是可以的。首先,我们枚举所有的点作为最小点,然后横向展开,遇到更小的就停止。。。然后再操作一下,看上去时间O(N^2),然而由于数据的随机生成性,差不多能做到O(NlogN)出解,然而由于数据的过于随机性,这么做比正解还要快。。。但是如果数据整齐的话应该怎么办呢,比如都是同一个数的情况。。
这时我们可以先排序,从最大的开始搜起,然后如果有进行最优性剪枝,复杂度貌似可以保证在O(NlogN^2)左右。
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define re register #define wc 0.0000000001 using namespace std; struct point { int v,id; }; point a[10000001]; long long n,d[1000001],ans,maxx,lt,sum; inline bool cmp(point x,point y) { return x.v>y.v; } int main() { cin>>n; for(re int i=1;i<=n;i++) { cin>>d[i]; a[i].v=d[i]; a[i].id=i; sum+=d[i]; } sort(a+1,a+n+1,cmp); for(re int i=1;i<=n;i++) { if(a[i].v*sum<=ans) continue; int l=a[i].id,r=a[i].id; long long cnt=a[i].v; while(d[l-1]>=a[i].v) { cnt+=d[l]; l--; } while(d[r+1]>=a[i].v) { cnt+=d[r]; r++; } maxx=a[i].v*cnt; ans=max(maxx,ans); } cout<<ans; }