Submission #859343

#TimeUsernameProblemLanguageResultExecution timeMemory
859343wiiTriple Jump (JOI19_jumps)C++17
0 / 100
123 ms41024 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; using namespace std; typedef double db; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; #define X first #define Y second #define gcd __gcd #define pb push_back #define all(x) (x).begin(), (x).end() #define bit(i, mask) ((mask) >> (i) & 1) #define reset(x, val) memset(x, val, sizeof(x)) #define foru(i,a,b) for(int i = (a); i <= (b); ++i) #define ford(i,a,b) for(int i = (a); i >= (b); --i) #define FastIO ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); template<typename T> bool maximize(T &res, const T &val) { if (res < val) { res = val; return true; } return false; } template<typename T> bool minimize(T &res, const T &val) { if (val < res) { res = val; return true; } return false; } const ll Linf = 0x3f3f3f3f3f3f3f3f; const int Inf = 0x3f3f3f3f; const ll Mod = 1e9 + 7; const ll Mod2 = ll(1e9) + 9; const int Lim = 1e6 + 5; const int inv6 = 166666668; // #define Sieve #ifdef Sieve vector<int> pr; vector<int> lpf; void Linear_sieve(int n = Lim) { pr.assign(1, 2); lpf.assign(n + 1, 2); for (int x = 3; x <= n; x += 2) { if (lpf[x] == 2) pr.push_back(lpf[x] = x); for (int i = 1; i < pr.size() && pr[i] <= lpf[x] && pr[i] * x <= n; ++i) lpf[pr[i] * x] = pr[i]; } } #endif // #define Ckn_calc #ifdef Ckn_calc const int LIM = 1e6 + 16; int fact[LIM + 10]; /// factorial: fact[n] = n! int invs[LIM + 10]; /// inverse modular: invs[n] = n^(-1) int tcaf[LIM + 10]; /// inverse factorial: tcaf[n] = (n!)^(-1) void precal_nck(int n = LIM) { fact[0] = fact[1] = 1; invs[0] = invs[1] = 1; tcaf[0] = tcaf[1] = 1; for (int i = 2; i <= n; ++i) { fact[i] = (1LL * fact[i - 1] * i) % Mod; invs[i] = Mod - 1LL * (Mod / i) * invs[Mod % i] % Mod; tcaf[i] = (1LL * tcaf[i - 1] * invs[i]) % Mod; } } ll C(int n, int k) { if (n < k || k < 0) return 0; ll res = fact[n]; res *= tcaf[k], res %= Mod; res *= tcaf[n - k], res %= Mod; return res; } ll P(int n, int k) { ll res = fact[n]; res *= tcaf[n - k], res %= Mod; return res; } #endif /// ====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*==== const int base = 3; const int N = 5e5 + 5; const int K = log2(N) + 2; const int dx[] = {+1, -1, 0, 0}; const int dy[] = {0, 0, +1, -1}; const int block_size = sqrt(2e9) + 2; int n; int a[N]; vector<pii> qs[N]; vector<pii> upd[N]; pii f[N * 4]; int lazy[N * 4]; #define lx (id << 1) #define rx (lx | 1) pii combine(pii l, pii r) { return make_pair(max(l.first, r.first), max(l.second, r.second)); } void push(int id, int val) { maximize(f[id].first, f[id].second + val); maximize(lazy[id], val); } void down(int id) { push(lx, lazy[id]); push(rx, lazy[id]); lazy[id] = 0; } void build(int l = 1, int r = n, int id = 1) { if (l == r) { return f[id] = make_pair(a[l], a[l]), void(); } int mid = (l + r) >> 1; build(l, mid, lx); build(mid + 1, r, rx); f[id] = combine(f[lx], f[rx]); } void update(int u, int v, int x, int l = 1, int r = n, int id = 1) { if (r < u || v < l) return; if (u <= l && r <= v) return push(id, x); down(id); int mid = (l + r) >> 1; update(u, v, x, l, mid, lx); update(u, v, x, mid + 1, r, rx); f[id] = combine(f[lx], f[rx]); } int get(int u, int v, int l = 1, int r = n, int id = 1) { if (r < u || v < l) return 0; if (u <= l && r <= v) return f[id].first; down(id); int mid = (l + r) >> 1; return max(get(u, v, l, mid, lx), get(u, v, mid + 1, r, rx)); } int ans[N]; void solve() { cin >> n; foru(i, 1, n) cin >> a[i]; int q; cin >> q; foru(i, 1, q) { int l, r; cin >> l >> r; qs[l].pb({r, i}); } build(); vector<int> d; foru(i, 1, n) { while (!d.empty()) { int j = d.back(); if (i * 2 - j) upd[j].pb({i * 2 - j, a[i] + a[j]}); if (a[i] > a[j]) break; d.pop_back(); } d.push_back(i); } ford(i, n, 1) { for (auto &[x, y]: upd[i]) { update(x, n, y); // cout << x << " " << n << " " << y << "\n"; } for (auto &[r, id]: qs[i]) { ans[id] = get(i, r); } } foru(i, 1, q) cout << ans[i] << "\n"; } signed main() { FastIO; #define task "test" if (fopen(task".inp", "r")) { freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } #ifdef Sieve Linear_sieve(); #endif #ifdef Ckn_calc precal_nck(); #endif int ntest = 1; // cin >> ntest; while (ntest--) { //cout << "Case " << q << ": " << "\n"; solve(); cout << "\n"; } return 0; } /** /\_/\ * (= ._.) * / >TL \>AC **/

Compilation message (stderr)

jumps.cpp: In function 'int main()':
jumps.cpp:208:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  208 |   freopen(task".inp", "r", stdin);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
jumps.cpp:209:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  209 |   freopen(task".out", "w", stdout);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...