Submission #1149941

#TimeUsernameProblemLanguageResultExecution timeMemory
1149941Zero_OPTwo Antennas (JOI19_antennas)C++20
100 / 100
482 ms42596 KiB
#include <bits/stdc++.h> using namespace std; //loops (warning : long long) #define FOR(i, l, r) for(int i = (l); i < (r); ++i) #define ROF(i, r, l) for(int i = (r - 1); i >= l; --i) //pairs, tuples #define mp make_pair #define mt make_tuple #define ff first #define ss second //vectors #define all(v) begin(v), end(v) #define rall(v) rbegin(v), rend(v) #define pb push_back #define eb emplace_back #define sum_of(v) accumulate(all(v), 0ll) #define sz(v) (int)v.size() #define compact(v) v.erase(unique(all(v)), end(v)) //binary search #define lwb lower_bound #define upb upper_bound //other stuffs #define dbg(x) "[" #x " = " << (x) << "]" #define file(task) if(fopen(task".inp", "r")){ freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } template<typename T> bool minimize(T& a, const T& b){ if(a > b) return a = b, true; return false; } template<typename T> bool maximize(T& a, const T& b){ if(a < b) return a = b, true; return false; } using ll = long long; using ull = unsigned long long; using ld = long double; using db = double; using pi = pair<int, int>; using pl = pair<ll, ll>; using vi = vector<int>; using vb = vector<bool>; using vl = vector<ll>; using vpi = vector<pi>; using vpl = vector<pl>; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); const int MAX = 3e5 + 5; const int inf = 1e9 + 7; struct SegmentTree{ struct Node{ int minH, maxH, lazyMin, lazyMax, result; Node() : minH(inf), maxH(-inf), lazyMin(inf), lazyMax(-inf), result(-1) {} }; vector<Node> st; SegmentTree(int n) : st(n << 2, Node()) {} void apply(int id, int val){ maximize(st[id].result, val - st[id].minH); maximize(st[id].result, st[id].maxH - val); minimize(st[id].lazyMin, val); maximize(st[id].lazyMax, val); } void pull(int id){ st[id].result = max(st[id << 1].result, st[id << 1 | 1].result); st[id].minH = min(st[id << 1].minH, st[id << 1 | 1].minH); st[id].maxH = max(st[id << 1].maxH, st[id << 1 | 1].maxH); } void down(int id){ if(st[id].lazyMin != inf){ apply(id << 1, st[id].lazyMin); apply(id << 1 | 1, st[id].lazyMin); st[id].lazyMin = inf; } if(st[id].lazyMax != -inf){ apply(id << 1, st[id].lazyMax); apply(id << 1 | 1, st[id].lazyMax); st[id].lazyMax = -inf; } } void apply_range(int id, int l, int r, int u, int v, int val){ if(u <= l && r <= v) apply(id, val); else{ int mid = l + r >> 1; down(id); if(u <= mid) apply_range(id << 1, l, mid, u, v, val); if(mid < v) apply_range(id << 1 | 1, mid + 1, r, u, v, val); pull(id); } } void update_position(int id, int l, int r, int pos, int val){ if(l == r){ if(val == -1) st[id].minH = inf, st[id].maxH = -inf; else st[id].minH = st[id].maxH = val; } else{ int mid = l + r >> 1; down(id); if(pos <= mid) update_position(id << 1, l, mid, pos, val); else update_position(id << 1 | 1, mid + 1, r, pos, val); pull(id); } } int query(int id, int l, int r, int u, int v){ if(v < l || u > r) return -1; if(u <= l && r <= v) return st[id].result; int mid = l + r >> 1; down(id); return max(query(id << 1, l, mid, u, v), query(id << 1 | 1, mid + 1, r, u, v)); } }; void testcase(int ntestcase){ int N; cin >> N; vi H(N), A(N), B(N); FOR(i, 0, N) cin >> H[i] >> A[i] >> B[i]; vector<vi> in(N), out(N); FOR(i, 0, N){ if(i + A[i] < N) in[i + A[i]].pb(i); if(i + B[i] < N) out[i + B[i]].pb(i); } SegmentTree T(N); int Q; cin >> Q; vector<vpi> queries(N); FOR(i, 0, Q){ int l, r; cin >> l >> r; --l, --r; queries[r].pb(mp(l, i)); } vi result(Q); FOR(i, 0, N){ for(auto j : in[i]) T.update_position(1, 0, N - 1, j, H[j]); if(i - A[i] >= 0) T.apply_range(1, 0, N - 1, max(0, i - B[i]), i - A[i], H[i]); for(auto [j, id] : queries[i]) result[id] = T.query(1, 0, N - 1, j, i); for(auto j : out[i]) T.update_position(1, 0, N - 1, j, -1); } FOR(i, 0, Q) cout << result[i] << '\n'; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); #ifdef LOCAL freopen("in.txt", "r", stdin); #endif // LOCAL int T = 1; // cin >> T; FOR(i, 0, T) testcase(i); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...