제출 #1273436

#제출 시각아이디문제언어결과실행 시간메모리
1273436hoangtien69Two Antennas (JOI19_antennas)C++20
0 / 100
176 ms42576 KiB
#include<bits/stdc++.h> using namespace std; const int MAXN = 2e5 + 5; #define int long long #define pii pair<int,int> const int INF = 1e18; int n; int a[MAXN]; int b[MAXN]; int q; int h[MAXN]; vector<pii> peal[MAXN]; vector<pii> query[MAXN]; int ans[MAXN]; struct Node { int maxx; int minn; int res; Node() { maxx = -INF; minn = INF; res = -INF; } }; Node st[4 * MAXN]; pii lazy[4 * MAXN]; Node Merge(Node A, Node B) { Node cak; cak.maxx = max(A.maxx, B.maxx); cak.minn = min(A.minn, B.minn); cak.res = max(A.res, B.res); return cak; } void push(int id, int l, int r) { if (lazy[id].first == -INF && lazy[id].second == INF) { return; } st[id].res = max({st[id].res, lazy[id].first - st[id].minn, st[id].maxx - lazy[id].second}); if (l != r) { lazy[id * 2].first = max(lazy[id].first, lazy[id * 2].first); lazy[id * 2].second = min(lazy[id].second, lazy[id * 2].second); lazy[id * 2 + 1].first = max(lazy[id].first, lazy[id * 2 + 1].first); lazy[id * 2 + 1].second = min(lazy[id].second, lazy[id * 2 + 1].second); } lazy[id] = {-INF, INF}; } void update(int id, int l, int r, int pos, int val1, int val2) { push(id, l, r); if (l == r) { st[id].maxx = val1; st[id].minn = val2; st[id].res = -INF; return; } int m = (l + r) / 2; if (pos <= m) { update(id * 2, l, m, pos, val1, val2); } else { update(id * 2 + 1, m + 1, r, pos, val1, val2); } push(id*2, l, m); push(id*2+1, m+1, r); st[id] = Merge(st[id * 2], st[id * 2 + 1]); } void update_range(int id, int l, int r, int u, int v, int val) { if (r < u || v < l) { return; } if (u <= l && r <= v) { lazy[id].first = max(lazy[id].first, val); lazy[id].second = min(lazy[id].second, val); st[id].res = max({st[id].res, lazy[id].first - st[id].minn, st[id].maxx - lazy[id].second}); return; } push(id, l, r); int m = (l + r) / 2; update_range(id * 2, l, m, u, v, val); update_range(id * 2 + 1, m + 1, r, u, v, val); Node trai = st[id*2]; trai.res = max({trai.res, lazy[id*2].first - trai.minn, trai.maxx - lazy[id*2].second}); Node phai = st[id*2+1]; phai.res = max({phai.res, lazy[id*2+1].first - phai.minn, phai.maxx - lazy[id*2+1].second}); st[id] = Merge(trai, phai); } Node get(int id, int l, int r, int u, int v) { push(id, l, r); if (v < l || r < u) { return Node(); } if (u <= l and r <= v) { return st[id]; } int m = (l + r) / 2; return Merge(get(id * 2, l, m, u, v), get(id * 2 + 1, m + 1, r, u, v)); } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; for (int i = 1; i <= n; i++) { cin >> h[i] >> a[i] >> b[i]; } cin >> q; for (int i = 1; i <= q; i++) { int l, r; cin >> l >> r; query[r].push_back({l, i}); } for (int i = 1; i <= n; i++) { if (i + a[i] <= n) { peal[i + a[i]].push_back({i, 1}); } if (i + b[i] + 1 <= n) { peal[i + b[i] + 1].push_back({i, -1}); } } for (int i = 1; i <= 4 * n; i++) { lazy[i] = {-INF, INF}; } for (int i = 1; i <= n; i++) { for (auto v : peal[i]) { if (v.second == 1) { update(1, 1, n, v.first, h[v.first], h[v.first]); } else { update(1, 1, n, v.first, -INF, INF); } } int l = max(1LL, i - b[i]); int r = i - a[i]; if (l <= r) { update_range(1, 1, n, l, r, h[i]); } for (auto[l_q, id] : query[i]) { ans[id] = -1; ans[id] = max(ans[id], get(1, 1, n, l_q, i).res); } } for (int i = 1; i <= q; i++) { if (ans[i] < 0) cout << -1 << "\n"; else cout << ans[i] << "\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...