Submission #1175395

#TimeUsernameProblemLanguageResultExecution timeMemory
1175395_ncng.nyrTriple Jump (JOI19_jumps)C++20
19 / 100
282 ms247228 KiB
#include<bits/stdc++.h>

#define int long long
#define ii pair<int, int>

using namespace std;

const int N = 5e5 + 5;

int n, q;
int a[N];
ii query[N];

namespace sub1 {
  void solve() {
    for(int i = 1; i <= q; ++i) {
      auto [l, r] = query[i];
      int res = 0;
      for(int x = l; x <= r; ++x)
        for(int y = x + 1; y <= r; ++y)
          for(int z = y + (y - x); z <= r; ++z) res = max(res, a[x] + a[y] + a[z]);

      cout << res << '\n';
    }
  }
}

namespace sub2 {
  int f[5'005][5'005], mx[5'005][5'005];

  void solve() {
    for(int i = 1; i <= n; ++i) {
      mx[i][i] = a[i];
      for(int j = i + 1; j <= n; ++j) mx[i][j] = max(mx[i][j - 1], a[j]);
    }

    for(int i = 1; i <= n; ++i)
      for(int j = i + 2; j <= n; ++j)
        f[i][j] = a[i] + a[j] + mx[i + 1][(i + j >> 1)];

    for(int i = n; i; --i)
      for(int j = i + 3; j <= n; ++j) {
        f[i][j] = max({f[i][j], f[i + 1][j], f[i][j - 1]});
        if(j - i - 1 >= 3) f[i][j] = max(f[i][j], f[i + 1][j - 1]);
      }

    for(int i = 1; i <= q; ++i) cout << f[query[i].first][query[i].second] << '\n';
  }
}

int32_t main() {
  cin.tie(0)->sync_with_stdio(0);

  cin >> n;
  for(int i = 1; i <= n; ++i) cin >> a[i];

  cin >> q;
  for(int i = 1; i <= q; ++i) cin >> query[i].first >> query[i].second;

  if(n <= 100 && q <= 100) sub1 :: solve();
  else if(n <= 5'000) sub2 :: solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...