fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define sz(s) long(s.size())
  4. #define ll long long
  5. #define F first
  6. #define S second
  7. #define pb push_back
  8. #define int ll
  9. #define all(v) v.begin(), v.end()
  10. #define file(s) freopen(s".in", "r", stdin); freopen(s".out", "w", stdout)
  11. const int N=1e6+7, mod=1e9+7, Mod=998244353;
  12. vector<int> pre, suf;
  13. int a[N];
  14. ll ans=0;
  15. void dnc(int l, int r, int l1, int r1) {
  16. int mid=(l1+r1)>>1;
  17. ll ma=0;
  18. int cnt=0;
  19. for(int w=r; w>=l; w--) {
  20. int i=pre[w], j=suf[mid];
  21. ll re=(a[i]+a[j])*1ll*abs(j-i);
  22. if(ma<re)ma=re, cnt=w;
  23. }
  24. ans=max(ans, ma);
  25. if(l1!=r1) {
  26. if(mid-l1>0)dnc(l, cnt, l1, mid-1);
  27. if(r1-mid>0)dnc(cnt, r, mid+1, r1);
  28. }
  29. }
  30. signed main() {
  31. ios_base::sync_with_stdio(NULL);
  32. cin.tie(NULL);
  33. int n;
  34. cin>>n;
  35. for(int i=1; i<=n; i++) {
  36. cin>>a[i];
  37. }
  38. pre.pb(1);
  39. for(int i=2; i<=n; i++) {
  40. if(a[i]>a[pre.back()])pre.pb(i);
  41. }
  42. suf.pb(n);
  43. for(int i=n-1; i>=1; i--) {
  44. if(a[i]>a[suf.back()])suf.pb(i);
  45. }
  46. reverse(suf.begin(), suf.end());
  47. dnc(0, sz(pre)-1, 0, sz(suf)-1);
  48. cout << ans << '\n';
  49. }
  50.  
Time limit exceeded #stdin #stdout 5s 5360KB
stdin
Standard input is empty
stdout
Standard output is empty