Submission #503075

#TimeUsernameProblemLanguageResultExecution timeMemory
503075blueTriple Jump (JOI19_jumps)C++17
100 / 100
899 ms105868 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; using ll = long long; using vll = vector<ll>; using vi = vector<int>; const int maxN = 500'000; const ll INF = 1'000'000'000'000'000'000LL; int N, Q; vll A; const int Z = (1<<19); struct segtree { vll lp = vll(Z<<1, -INF); vll half = vll(Z<<1, 0); vll full = vll(Z<<1, -INF); void build(int i, int l, int r) { if(l == r) { half[i] = A[l]; } else { build(2*i, l, (l+r)/2); build(2*i+1, (l+r)/2+1, r); half[i] = max(half[2*i], half[2*i+1]); } } void deploy(int i, int l, int r, int L, int R, ll V) { if(R < l || r < L) return; else if(L <= l && r <= R) { // cerr << "direct deployed A: " << i << ' ' << l << ' ' << r << ' ' << lp[i] << ' ' << full[i] << '\n'; lp[i] = max(lp[i], V); full[i] = max(full[i], half[i] + lp[i]); // cerr << "direct deployed B: " << i << ' ' << l << ' ' << r << ' ' << lp[i] << ' ' << full[i] << '\n'; } else { deploy(2*i, l, (l+r)/2, L, R, V); deploy(2*i+1, (l+r)/2+1, r, L, R, V); full[i] = max({half[i] + lp[i], full[2*i], full[2*i+1]}); // cerr << "full " << i << ' ' << l << ' ' << r << " = " << full[i] << '\n'; } } pair<ll, ll> rangemax(int i, int l, int r, int L, int R) { if(R < l || r < L) return {-INF, -INF}; else if(L <= l && r <= R) { // cerr << "range: " << i << ' ' << l << ' ' << r << " - " << full[i] << ' ' << half[i] << '\n'; return {full[i], half[i]}; } else { pair<ll, ll> lft =rangemax(2*i, l, (l+r)/2, L, R); pair<ll, ll> rgt = rangemax(2*i+1, (l+r)/2+1, r, L, R); return {max({lft.first, rgt.first, lft.second + lp[i], rgt.second + lp[i]}), max(lft.second, rgt.second)}; } } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> N; A = vll(1+N+1); for(int i = 1; i <= N; i++) cin >> A[i]; vi re[1+N]; A[N+1] = INF; vi st{N+1}; for(int i = N; i >= 1; i--) { while(A[i] > A[st.back()]) { // cerr << "pair: " << i << ' ' << st.back() << '\n'; re[i].push_back(st.back()); st.pop_back(); } if(st.back() != N+1) re[i].push_back(st.back()); // if(st.back() != N+1) cerr << "npair: " << i << " " << st.back() << '\n'; st.push_back(i); } cin >> Q; vi l(1+Q), r(1+Q), lqi[1+N]; for(int j = 1; j <= Q; j++) { cin >> l[j] >> r[j]; lqi[l[j]].push_back(j); } vll res(1+Q, -INF); segtree S; S.build(1, 1, N); // for(int f = 1; f <= N; f++) cerr << S.rangemax(1, 1, N, f, f).first << ' '; // cerr << '\n'; for(int li = N; li >= 1; li--) { // cerr << "\n\n\n\n"; // if(li == 2) cerr << "!!!! " << li << ' ' << S.full[3] << '\n'; for(int ri: re[li]) { if(ri + (ri - li) > N) continue; S.deploy(1, 1, N, ri + (ri - li), N, A[li] + A[ri]); // cerr << "deploying " << li << ' ' << ri << " : " << A[li]+A[ri] << " to range " << ri + (ri - li) << ' ' << N << '\n'; // cerr << "segtree = "; // for(int f = 1; f <= N; f++) cerr << S.rangemax(1, 1, N, f, f).first << ' '; // cerr << '\n'; } // cerr << "\n\n"; // if(li == 2) cerr << "!!!! " << li << ' ' << S.full[3] << '\n'; // if(li == 2) // { // cerr << "segtree = \n"; // for(int f = 1; f <= N; f++) // { // cerr << "f = " << f << " : " << S.rangemax(1, 1, N, f, f).first << '\n'; // } // } // if(li == 2) cerr << "!!!! " << li << ' ' << S.full[3] << '\n'; for(int q: lqi[li]) { // cerr << "answering: " << q << '\n'; res[q] = S.rangemax(1, 1, N, li, r[q]).first; } } for(int j = 1; j <= Q; j++) cout << res[j] << '\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...