Submission #1297980

#TimeUsernameProblemLanguageResultExecution timeMemory
1297980TrieTrTwo Antennas (JOI19_antennas)C++20
35 / 100
155 ms23408 KiB
#include<bits/stdc++.h> using namespace std; void local() { #define taskname "" if (fopen(taskname".inp", "r")) { freopen(taskname".inp", "r", stdin); freopen(taskname".out", "w", stdout); } } #define ll long long #define fi first #define se second #define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); template<class X, class Y> bool mini(X &a, const Y &b) {return (a > b) ? a = b, true : false;} template<class X, class Y> bool maxi(X &a, const Y &b) {return (a < b) ? a = b, true : false;} const int N = 2e5 + 5; int n; int h[N], a[N], b[N]; int q; pair<int, int> que[N]; namespace sub2 { bool check() { return n <= 2e3; } struct SegmentTree { using T = int; vector<T> st; int n; void init(int n_) { n = n_; st.assign((n + 5) << 2, -2e9 - 1); } void update(int x, int v, int l, int r, int id) { if(l > x || r < x) return; if(l == r) { maxi(st[id], v); return; } int mid = (l + r) >> 1; update(x, v, l, mid, id << 1); update(x, v, mid + 1, r, id << 1 | 1); st[id] = max(st[id << 1], st[id << 1 | 1]); } T get(int x, int y, int l, int r, int id) { if(l > y || r < x) return -2e9 - 1; if(l >= x && r <= y) return st[id]; int mid = (l + r) >> 1; return max(get(x, y, l, mid, id << 1), get(x, y, mid + 1, r, id << 1 | 1)); } }; vector<pair<int, int>> event[N]; bool isin(int i, int x, int y) { return x <= i && i <= y; } int ans[N]; void solve() { for(int i = 1; i <= q; i++) { auto[l, r] = que[i]; event[r].emplace_back(l, i); } SegmentTree T; T.init(n); for(int i = 1; i <= n; i++) { for(int j = 1; j < i; j++) { if(isin(abs(i - j), a[j], b[j]) && isin(abs(i - j), a[i], b[i])) { T.update(j, abs(h[i] - h[j]), 1, n, 1); } } for(auto[l, id] : event[i]) { ans[id] = T.get(l, i, 1, n, 1); } } for(int i = 1; i <= q; i++) cout << (ans[i] == -2e9 - 1 ? -1 : ans[i]) << '\n'; } } namespace sub3 { bool check() { return q == 1 && que[1].fi == 1 && que[1].se == n; } struct SegmentTree { using T = pair<int, int>; vector<T> st; int n; void init(int n_) { n = n_; st.assign((n + 5) << 2, make_pair(-1, -1)); } T merge(T a, T b) { T c; if(a.fi == -1) return b; if(b.fi == -1) return a; c.fi = min(a.fi, b.fi); c.se = max(a.se, b.se); return c; } void update(int x, int v, int l, int r, int id) { if(l > x || r < x) return; if(l == r) { st[id].fi = v; st[id].se = v; return; } int mid = (l + r) >> 1; update(x, v, l, mid, id << 1); update(x, v, mid + 1, r, id << 1 | 1); st[id] = merge(st[id << 1], st[id << 1 | 1]); } T get(int x, int y, int l, int r, int id) { if(l > y || r < x) return make_pair(-1, -1); if(l >= x && r <= y) return st[id]; int mid = (l + r) >> 1; return merge(get(x, y, l, mid, id << 1), get(x, y, mid + 1, r, id << 1 | 1)); } }; vector<pair<int, int>> event[N]; int res = -1; void solve() { for(int i = 1; i <= n; i++) { event[max(0, i - b[i])].emplace_back(i, 1); event[max(0, i - a[i] + 1)].emplace_back(i, -1); event[min(n + 1, i + a[i])].emplace_back(i, 1); event[min(n + 1, i + b[i] + 1)].emplace_back(i, -1); } SegmentTree T; T.init(n); for(int i = 1; i <= n; i++) { for(auto[id, t] : event[i]) { if(t == 1) { T.update(id, h[id], 1, n, 1); } else { T.update(id, -1, 1, n, 1); } } pair<int, int> cur = T.get(max(1, i - b[i]), max(0, i - a[i]), 1, n, 1); if(cur.fi == -1) continue; maxi(res, h[i] - cur.fi); maxi(res, cur.se - h[i]); } cout << res; } } int main() { fastio; local(); 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; que[i] = make_pair(l, r); } if(sub2::check()) sub2::solve(); else if(sub3::check()) sub3::solve(); }

Compilation message (stderr)

antennas.cpp: In function 'void local()':
antennas.cpp:7:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    7 |         freopen(taskname".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
antennas.cpp:8:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    8 |         freopen(taskname".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...