Submission #1305058

#TimeUsernameProblemLanguageResultExecution timeMemory
1305058hoa208Triple Jump (JOI19_jumps)C++20
100 / 100
1099 ms142324 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; i++) #define FORD(i, b, a) for (int i = (b), _a = (a); i >= _a; i--) #define pa pair<ll, ll> #define fi first #define se second #define bit(mask, j) ((mask >> j) & 1) const ll mod = 1e9 + 7; const ll INF = 1e16; //-------------------------------------------------------------------- ll n, q; const ll N = 5e5 + 10; ll a[N], L[N], R[N]; namespace sub1 { bool check() { return n <= 100 && q <= 100; } void slove() { FOR(i, 1, q) { ll l = L[i], r = R[i]; ll ans = 0; FOR(j, l, r) { FOR(z, j + 1, r) { FOR(u, z + 1, r) { bool dk2 = (z - j <= u - z); if(dk2 == 1) { ans = max(ans, a[j] + a[z] + a[u]); } } } } cout << ans << '\n'; } } } namespace sub4 { pa b[N]; struct segtree { ll ans, mx, lazy; } st[4 * N]; void build(ll id = 1, ll l = 1, ll r = n) { if(l == r) { st[id].mx = a[l]; return; } ll mid = l + r >> 1; build(id << 1, l, mid); build(id << 1 | 1, mid + 1, r); st[id].mx = max(st[id << 1].mx, st[id << 1 | 1].mx); } void add(ll id, ll val) { st[id].ans = max(st[id].ans, st[id].mx + val); st[id].lazy = max(st[id].lazy, val); } void down(ll id) { add(id << 1, st[id].lazy); add(id << 1 | 1, st[id].lazy); st[id].lazy = 0; } void update(ll u, ll v, ll val, ll id = 1, ll l = 1, ll r = n) { if(u > r || v < l) return; if(u <= l && v >= r) { add(id, val); return; } ll mid = l + r >> 1; down(id); update(u, v, val, id << 1, l, mid); update(u, v, val, id << 1 | 1, mid + 1, r); st[id].ans = max(st[id << 1].ans, st[id << 1 | 1].ans); } ll get(ll u, ll v, ll id = 1, ll l = 1, ll r = n) { if(u > r || v < l) return 0; if(u <= l && v >= r) { return st[id].ans; } ll mid = l + r >> 1; down(id); return max(get(u, v, id << 1, l, mid), get(u, v, id << 1 | 1, mid + 1, r)); } vector<pa> event[N], qr[N]; ll ans[N]; void slove() { FOR(i, 1, n) { b[i] = {a[i], i}; } build(); sort(b + 1, b + n + 1); set<ll> st; st.insert(n + 1); st.insert(0); FORD(i, n, 1) { ll val = b[i].fi, id = b[i].se; auto it = st.lower_bound(id); ll r = *it; ll l = *--it; if(r <= n && 2 * r - id <= n) { event[id].push_back({a[r] + a[id], 2 * r - id}); } if(l > 0 && 2 * id - l <= n) { event[l].push_back({a[l] + a[id], 2 * id - l}); } st.insert(id); } FOR(i, 1, q) { qr[L[i]].push_back({R[i], i}); } FORD(i, n, 1) { for(auto e : event[i]) { update(e.se, n, e.fi); } for(auto e : qr[i]) { ans[e.se] = get(i, e.fi); } } FOR(i, 1, q) { cout << ans[i] << '\n'; } } } void hbmt() { cin >> n; FOR(i, 1, n) { cin >> a[i]; } cin >> q; FOR(i, 1, q) { cin >> L[i] >> R[i]; } // if(sub1::check()) return sub1::slove(); return sub4::slove(); } int main() { ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); #define NAME "hbmt" if(fopen(NAME".inp", "r")) { freopen(NAME".inp", "r", stdin); freopen(NAME".out", "w", stdout); } //int t;cin>>t;while(t--) hbmt(); return 0; }

Compilation message (stderr)

jumps.cpp: In function 'int main()':
jumps.cpp:146:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  146 |         freopen(NAME".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
jumps.cpp:147:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  147 |         freopen(NAME".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...