제출 #163611

#제출 시각아이디문제언어결과실행 시간메모리
163611combi1k13단 점프 (JOI19_jumps)C++14
100 / 100
1741 ms126968 KiB
#include<bits/stdc++.h> using namespace std; #define FOR(i,a,b) for(int i = a ; i <= b ; ++i) #define X first #define Y second #define pb push_back #define ll long long #define lch i << 1 #define rch i << 1 | 1 #define Unit Node(-2e9,-2e9,-3e9) const int N = 5e5 + 1; typedef pair<int,int> ii; struct Node { ll L, R, S; Node(ll l = 0,ll r = 0,ll s = 0) : L(l), R(r), S(s) {} } tr[N << 2]; Node Spare; Node operator + (const Node &a,const Node &b) { ll x = max(a.L,b.L); ll y = max(a.R,b.R); ll z = max(a.S,b.S); return Node(x,y,max(z,a.L + b.R)); } void upd(int i,int l,int r,int p,int v,int t) { if (l > p) return; if (r < p) return; if (l == r) { if (t) tr[i].R = max(tr[i].R,(ll)v); else tr[i].L = max(tr[i].L,(ll)v); tr[i].S = tr[i].L + tr[i].R; return; } int m = (l + r) / 2; upd(lch,l,m,p,v,t); ++m; upd(rch,m,r,p,v,t); tr[i] = tr[lch] + tr[rch]; } void get(int i,int l,int r,int L,int R) { if (l > R) return; if (L > r) return; if (L <= l && r <= R) { Spare = Spare + tr[i]; return; } int m = (l + r) / 2; get(lch,l,m,L,R); ++m; get(rch,m,r,L,R); } vector<ii> Que[N]; vector<ii> Seg[N]; int a[N]; int t[N]; int tot = 0; ll ans[N]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; fill(tr + 1,tr + 4 * n,Unit); auto add = [&](int x,int y) { if (y + y <= n + x) Seg[x].pb(ii(y + y - x,a[x] + a[y])); }; auto ask = [&](int l,int r) { Spare = Unit; get(1,1,n,l,r); return Spare.S; }; FOR(i,1,n) { cin >> a[i]; for(; tot && a[t[tot]] < a[i] ; --tot) add(t[tot],i); if (tot) add(t[tot],i); t[++tot] = i; } int q; cin >> q; FOR(i,1,q) { int l; cin >> l; int r; cin >> r; Que[l].push_back(ii(r,i)); } for(int i = n ; i >= 1 ; --i) { upd(1,1,n,i,a[i],1); for(ii e : Seg[i]) upd(1,1,n,e.X,e.Y,0); for(ii e : Que[i]) ans[e.Y] = ask(i,e.X); } FOR(i,1,q) cout << ans[i] << "\n"; } /* 5 5 2 1 5 3 3 1 4 2 5 1 5 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...