Submission #202485

#TimeUsernameProblemLanguageResultExecution timeMemory
202485onjo0127Triple Jump (JOI19_jumps)C++11
100 / 100
1432 ms89960 KiB
#include <bits/stdc++.h> using namespace std; using pii = pair<int, int>; struct node { int v, f, a; } T[1050000]; const node EMP = {0, 0, 0}; node operator +(node L, node R) { node ret; ret.f = max(L.f, R.f); ret.a = max(L.a, R.a); ret.v = max({L.v, R.v, L.f + R.a}); return ret; } int A[500009], ans[500009], F[500009]; vector<pii> query[500009]; vector<int> add[500009]; void init(int idx, int s, int e) { if(s == e) { T[idx] = {A[s], 0, A[s]}; return; } int m = s+e >> 1; init(idx*2, s, m); init(idx*2+1, m+1, e); T[idx] = T[idx*2] + T[idx*2+1]; } void upd(int idx, int s, int e, int p, int v) { if(p < s || e < p) return; if(s == e) { T[idx].f = v; T[idx].v = T[idx].f + T[idx].a; return; } int m = s+e >> 1; upd(idx*2, s, m, p, v); upd(idx*2+1, m+1, e, p, v); T[idx] = T[idx*2] + T[idx*2+1]; } node get(int idx, int s, int e, int l, int r) { if(r < s || e < l) return EMP; if(l <= s && e <= r) return T[idx]; int m = s+e >> 1; return get(idx*2, s, m, l, r) + get(idx*2+1, m+1, e, l, r); } int main() { int N; scanf("%d", &N); for(int i=1; i<=N; i++) scanf("%d", &A[i]); int Q; scanf("%d", &Q); for(int i=0; i<Q; i++) { int l, r; scanf("%d%d",&l,&r); query[l].push_back({r, i}); } vector<int> S; for(int i=1; i<=N; i++) { while(S.size() && A[S.back()] < A[i]) { add[S.back()].push_back(i); S.pop_back(); } if(S.size()) add[S.back()].push_back(i); S.push_back(i); } init(1, 1, N); for(int i=N; i>=1; i--) { for(auto& it: add[i]) if(2*it - i <= N) { F[2*it - i] = max(F[2*it - i], A[i] + A[it]); upd(1, 1, N, 2*it - i, F[2*it - i]); } for(auto& it: query[i]) ans[it.second] = get(1, 1, N, i, it.first).v; } for(int i=0; i<Q; i++) printf("%d\n", ans[i]); return 0; }

Compilation message (stderr)

jumps.cpp: In function 'void init(int, int, int)':
jumps.cpp:24:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int m = s+e >> 1;
          ~^~
jumps.cpp: In function 'void upd(int, int, int, int, int)':
jumps.cpp:37:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int m = s+e >> 1;
          ~^~
jumps.cpp: In function 'node get(int, int, int, int, int)':
jumps.cpp:46:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int m = s+e >> 1;
          ~^~
jumps.cpp: In function 'int main()':
jumps.cpp:51:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  int N; scanf("%d", &N);
         ~~~~~^~~~~~~~~~
jumps.cpp:52:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=1; i<=N; i++) scanf("%d", &A[i]);
                          ~~~~~^~~~~~~~~~~~~
jumps.cpp:53:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  int Q; scanf("%d", &Q);
         ~~~~~^~~~~~~~~~
jumps.cpp:55:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   int l, r; scanf("%d%d",&l,&r);
             ~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...