Submission #1253415

#TimeUsernameProblemLanguageResultExecution timeMemory
1253415ankiteTriple Jump (JOI19_jumps)C++20
0 / 100
23 ms20552 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; struct Node { ll best1; // max A[i] ll best2; // max A[i]+A[j] for i<j ll best3; // max A[x]+A[y]+A[z] with x<y<z and (y-x)<= (z-y) }; int N, Q; vector<ll> A; vector<Node> seg; // Merge two adjacent segments L and R into U Node merge_node(const Node &L, const Node &R) { Node U; U.best1 = max(L.best1, R.best1); U.best2 = max({ L.best2, R.best2, L.best1 + R.best1 }); U.best3 = max({ L.best3, R.best3, L.best2 + R.best1, // x,y in L; z in R L.best1 + R.best2 // x in L; y,z in R }); return U; } // Build segment tree over [l..r] void build(int idx, int l, int r) { if (l == r) { seg[idx] = { A[l], LLONG_MIN/2, LLONG_MIN/2 }; return; } int m = (l + r) >> 1; build(idx<<1, l, m); build(idx<<1|1, m+1, r); seg[idx] = merge_node(seg[idx<<1], seg[idx<<1|1]); } // Query segment tree on [ql..qr] Node query(int idx, int l, int r, int ql, int qr) { if (ql <= l && r <= qr) { return seg[idx]; } int m = (l + r) >> 1; if (qr <= m) return query(idx<<1, l, m, ql, qr); if (ql > m) return query(idx<<1|1, m+1, r, ql, qr); Node left = query(idx<<1, l, m, ql, qr); Node right= query(idx<<1|1, m+1, r, ql, qr); return merge_node(left, right); } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); // Input cin >> N; A.resize(N+1); for (int i = 1; i <= N; i++) { cin >> A[i]; } cin >> Q; // Build tree seg.resize(4*(N+1)); build(1, 1, N); // Process queries while (Q--) { int l, r; cin >> l >> r; Node res = query(1, 1, N, l, r); // If no valid triple exists, res.best3 will be very negative. cout << res.best3 << "\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...