Submission #950426

#TimeUsernameProblemLanguageResultExecution timeMemory
950426vjudge1Triple Jump (JOI19_jumps)C++17
19 / 100
455 ms152716 KiB
#include<bits/stdc++.h> using namespace std; const int N = (int)5e5+7; const int M = (int)2e5+7; const int inf = (int)1e9+7; int n, q, a[N]; int dp[5003][5003], mx[5003][5003]; pair<int, int> suf[N]; int l[N], r[N]; int ans; void calc(int i, int j) { if(j+(j-i)<=n) { ans = max(ans, a[i]+a[j]+suf[j+(j-i)].first); } } void solve3() { cin >> q >> q >> q; for(int i = n; i >= 1; --i) { suf[i] = max(suf[i+1], {a[i], i}); } stack<int> st; for(int i = 1; i <= n; ++i) { l[i] = i; while(!st.empty() && a[st.top()]<a[i]) { l[i]=l[st.top()]; st.pop(); } st.push(i); } while(!st.empty()) { continue; } for(int i = n; i >= 1; --i) { r[i] = i; while(!st.empty() && a[st.top()]<a[i]) { r[i] = r[st.top()]; st.pop(); } } for(int i = 1; i < n; ++i) { int j = r[i]+1; if(j <= n) { calc(i, j); } } for(int i = 2; i < n; ++i) { int j = l[i]-1; if(j >= 1) { calc(j, i); } } cout << ans; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> n; for(int i = 1; i <= n; ++i) { cin >> a[i]; } if(n>5000) { solve3(); return 0; } for(int i = 1; i <= n; ++i) { for(int j = i; j <= n; ++j) { mx[i][j] = max(mx[i][j-1], a[j]); } } for(int len = 3; len <= n; ++len) { for(int i = 1; i <= n-len+1; ++i) { int j = i+len-1; dp[i][j]=max(dp[i+1][j], dp[i][j-1]); int cur = a[i]+a[j]; int m = (i+j)/2; cur += mx[i+1][m]; dp[i][j] = max(dp[i][j], cur); } } cin >> q; while(q--) { int l, r; cin >> l >> r; cout << dp[l][r] << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...