제출 #1118827

#제출 시각아이디문제언어결과실행 시간메모리
1118827Dan4Life3단 점프 (JOI19_jumps)C++17
100 / 100
1557 ms133768 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back #define int long long #define sz(a) (int)a.size() using ar2 = array<int,2>; const int N = (int)1e6+10; const int INF = (int)1e18; int n, q, a[N], ans[N]; vector<ar2> v[N], Q[N]; stack<int> S; struct Data{ int mxSm, mxA, ans;} seg[2*N]; Data comb(Data a, Data b){ Data c; c.mxSm = max(a.mxSm, b.mxSm); c.mxA = max(a.mxA, b.mxA); c.ans = max({a.ans,b.ans,a.mxSm+b.mxA}); return c; } void upd(int x, int v, int p=0, int l=1, int r=n){ if(l==r){ seg[p].mxSm = max(seg[p].mxSm, v); seg[p].mxA = max(seg[p].mxA,a[x]); seg[p].ans = seg[p].mxSm+seg[p].mxA; return; } int mid = (l+r)/2; int rp = p+2*(mid-l+1); if(x<=mid) upd(x,v,p+1,l,mid); else upd(x,v,rp,mid+1,r); seg[p] = comb(seg[p+1],seg[rp]); } Data query(int i, int j, int p=0, int l=1, int r=n){ if(i>r or j<l or i>j) return {-INF,-INF,-INF}; if(i<=l and r<=j) return seg[p]; int mid = (l+r)/2; int rp = p+2*(mid-l+1); return comb(query(i,j,p+1,l,mid),query(i,j,rp,mid+1,r)); } int32_t main(){ cin >> n; for(int i = 1; i <= n; i++) cin >> a[i]; for(int i = n,j; i >= 1; i--){ while(sz(S) and a[S.top()]<a[i]) j = S.top(), v[i].pb({j,a[i]+a[j]}),S.pop(); if(sz(S)) j = S.top(), v[i].pb({j,a[i]+a[j]}); S.push(i); } cin >> q; for(int l,r,i=1; i <= q; i++) cin >> l >> r, Q[l].pb({r,i}); for(int i = n; i >= 1; i--){ for(auto [j,sum] : v[i]) if(2*j-i<=n) upd(2*j-i,sum); for(auto [j,ind] : Q[i]) ans[ind] = query(i,j).ans; } for(int i = 1; i <= q; i++) cout << ans[i] << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...