Hydron

Untitled

Jan 5th, 2024
682
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.27 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <time.h>
  6.  
  7. // #define DEBUG
  8. // #define ABOBA
  9.  
  10. #define mins_t ll
  11.  
  12. typedef long long ll;
  13.  
  14. const ll INF = 1000000001;
  15.  
  16. // typedef struct {
  17. //     ll first, second;
  18. // } mins_t;
  19.  
  20. ll min(ll a, ll b) {
  21.     return a < b ? a : b;
  22. }
  23.  
  24. ll max(ll a, ll b) {
  25.     return a > b ? a : b;
  26. }
  27.  
  28. ll n;
  29. ll *a, *max_step;
  30.  
  31. mins_t **table;
  32.  
  33. mins_t fetch(mins_t a, mins_t b) {
  34.     /*mins_t ans;
  35.     if (a.first < b.first) {
  36.         ans.first = a.first;
  37.         ans.second = min(a.second, b.first);
  38.     } else {
  39.         ans.first = b.first;
  40.         ans.second = min(b.second, a.first);
  41.     }
  42.     return ans;*/
  43.     return min(a, b);
  44. }
  45.  
  46. mins_t get_mins(ll l, ll r) {
  47.     #ifndef ABOBA
  48.     if (l > r) {
  49.         return (mins_t){INF, INF};
  50.     }
  51.     ll j = max_step[r-l+1];
  52.     return fetch(table[r][j], table[l+(1<<j) - 1][j]);
  53.     #else
  54.     if (l > n-1 || l < 0 || r < 0 || r > n-1 || l > r) {
  55.         return (mins_t){INF, INF};
  56.     }
  57.     ll ans = a[l];
  58.     for (ll i=l+1; i<r+1; ++ i) {
  59.         ans = min(ans, a[i]);
  60.     }
  61.     return ans;
  62.     #endif
  63. }
  64.  
  65. int main(void) {
  66.     scanf("%lld", &n);
  67.     a = (ll*) malloc (sizeof(ll) * n);
  68.     for (ll i=0; i<n; ++ i) {
  69.         scanf("%lld", &a[i]);
  70.     }
  71.     ll m = 21;
  72.     table = (mins_t**) malloc(sizeof(mins_t*) * n);
  73.     for (ll i=0; i<n; ++ i) {
  74.         table[i] = (mins_t*)malloc(sizeof(mins_t) * m);
  75.     }
  76.     for (ll i=0; i<n; ++ i) {
  77.         table[i][0] = a[i];
  78.     }
  79.     for (ll j=1; j<m; ++ j) {
  80.         for (ll i=0; i<n; ++ i) {
  81.             if ((i - (1 << (j-1))) > -1) {
  82.                 table[i][j] = fetch(table[i][j-1], table[i-(1<<(j-1))][j-1]);
  83.             } else {
  84.                 table[i][j] = table[i][j-1];
  85.             }
  86.         }
  87.     }
  88.     max_step = (ll*) malloc(sizeof(ll) * (n+1));
  89.     max_step[0] = 0;
  90.     for (ll i=1; i<=n; ++ i) {
  91.         max_step[i] = max_step[i-1];
  92.         if ((1 << (max_step[i] + 1)) <= i) {
  93.             ++ max_step[i];
  94.         }
  95.     }
  96.     #ifdef DEBUG
  97.     for (ll i=0; i<n; ++ i) {
  98.         for (ll j=i; j<n; ++ j) {
  99.             mins_t tmp = get_mins(i, j);
  100.             printf("[DEBUG] %lld, %lld: %lld\n", i, j, tmp);
  101.         }
  102.     }
  103.     #endif
  104.     ll ans = 0;
  105.     for (ll i=0; i<n; ++ i) {
  106.         ll l = i, r = i;
  107.         ll L, R, M;
  108.         L = 0, R = i;
  109.         while(L<R) {
  110.             M = (L+R) >> 1;
  111.             if (get_mins(M, i) == a[i]) {
  112.                 R = M;
  113.             } else {
  114.                 L = M + 1;
  115.             }
  116.         }
  117.         l = R;
  118.         L = i, R = n-1;
  119.         while(L<R) {
  120.             M = (L+R+1) >> 1;
  121.             if (get_mins(i, M) == a[i]) {
  122.                 L = M;
  123.             } else {
  124.                 R = M - 1;
  125.             }
  126.         }
  127.         r = L;
  128.         if (r > l) {
  129.             ll nmin = INF;
  130.             if (i > l) {
  131.                 nmin = get_mins(l, i-1);
  132.             }
  133.             if (i < r) {
  134.                 nmin = min(nmin, get_mins(i+1, r));
  135.             }
  136.             ans = max(ans, (r-l+1) * (a[i] + nmin));
  137.         }
  138.         if (l > 0) {
  139.             ll l1 = l - 1;
  140.             if (l1 > 0 && a[l1-1] >= a[i]) {
  141.                 L = 0, R = l1-1;
  142.                 while(L<R) {
  143.                     M = (L+R) >> 1;
  144.                     if (get_mins(M, l1-1) >= a[i]) {
  145.                         R = M;
  146.                     } else {
  147.                         L = M + 1;
  148.                     }
  149.                 }
  150.                 l = R;
  151.             }
  152.             ans = max(ans, (r-l+1) * (a[i] + a[l1]));
  153.             l = l1 + 1;
  154.         }
  155.         if (r < n-1) {
  156.             ll r1 = r + 1;
  157.             if (r1 < n-1 && a[r1+1] >= a[i]) {
  158.                 L = r1 + 1, R = n-1;
  159.                 while(L<R) {
  160.                     M = (L+R+1) >> 1;
  161.                     if (get_mins(r1+1, M) >= a[i]) {
  162.                         L = M;
  163.                     } else {
  164.                         R = M - 1;
  165.                     }
  166.                 }
  167.                 r = L;
  168.             }
  169.             ans = max(ans, (r-l+1) * (a[i] + a[r1]));
  170.             r = r1 - 1;
  171.         }
  172.     }
  173.     printf("%lld\n", ans);
  174.     free(a);
  175.     free(max_step);
  176.     for (ll i=0; i<n; ++ i) {
  177.         free(table[i]);
  178.     }
  179.     free(table);
  180.     return 0;
  181. }
Advertisement
Add Comment
Please, Sign In to add comment