제출 #1255255

#제출 시각아이디문제언어결과실행 시간메모리
1255255shafi_rootTwo Antennas (JOI19_antennas)C++20
0 / 100
234 ms28852 KiB
/* _In The Name Of God_ */ #include <bits/stdc++.h> using namespace std; #define maxs(a, b) a = max(a, b) #define mins(a, b) a = min(a, b) #define pb push_back #define F first #define S second #define lc id << 1 #define rc lc|1 #define mid ((l + r)/2) // #define int long long typedef pair<int, int> pii; typedef long long ll; const ll MOD = 1e9 + 7; // 998244353; const ll INF = 1e9 + 1; const int MXN = 2e5 + 5; const int LOG = 23; ll Pow(ll a, ll b) { return !b ? 1 : (Pow(a*a %MOD, b/2) * (b&1 ? a : 1)) %MOD; } int n, h[MXN], q, ans[MXN], lz[2][MXN<<2]; pii L[MXN]; vector<pii> R[MXN], Q[MXN]; struct node { int mxl, ans; } seg[2][MXN<<2]; void Build(int l = 0, int r = n + 1, int id = 1) { seg[0][id].mxl = seg[0][id].ans = seg[1][id].mxl = lz[0][id] = lz[1][id] = seg[1][id].ans = -INF; if (r - l < 2) { return; } Build(l, mid, lc); Build(mid, r, rc); } void Put(int op, int id, int x) { maxs(seg[op][id].ans, x + seg[op][id].mxl); maxs(lz[op][id], x); } void Shift(int op, int l, int r, int id) { if (r - l > 1 && lz[op][id] != -INF) { Put(op, rc, lz[op][id]); Put(op, lc, lz[op][id]); lz[op][id] = -INF; } } void Set(int op, int s, int x, int l = 0, int r = n+1, int id = 1) { Shift(op, l, r, id); if (r - l < 2) { seg[op][id].mxl = x; seg[op][id].ans = -INF; return; } if (s < mid) Set(op, s, x, l, mid, lc); else Set(op, s, x, mid, r, rc); seg[op][id].ans = max(seg[op][lc].ans, seg[op][rc].ans); seg[op][id].mxl = max(seg[op][lc].mxl, seg[op][rc].mxl); } void Upd(int op, int s, int e, int x, int l = 0, int r = n + 1, int id = 1) { Shift(op, l, r, id); if (s <= l && r <= e) { Put(op, id, x); // if (x == -2) { // if (l == 0) { // cout << seg[op][id].mxl << ' ' << lz[op][id] << '\n'; // } // } return; } if (s < mid) Upd(op, s, e, x, l, mid, lc); if (mid < e) Upd(op, s, e, x, mid, r, rc); seg[op][id].ans = max({seg[op][lc].ans, seg[op][rc].ans}); } int Get(int op, int s, int e, int l = 0, int r = n+1, int id = 1) { Shift(op, l, r, id); if (s <= l && r <= e) return seg[op][id].ans; if (e <= mid) return Get(op, s,e, l, mid, lc); if (mid <= s) return Get(op, s,e, mid, r, rc); return max({Get(op, s,e, l, mid, lc), Get(op, s,e, mid, r, rc)}); } void _solve() { cin >> n; for (int i = 1; i <= n; i++) { int l, r; cin >> h[i] >> l >> r; L[i] = {max(0, i-r), max(0, i-l)}; R[min(i+l, n+1)].pb({1, i}); R[min(i+r+1, n+1)].pb({0, i}); } cin >> q; for (int i = 1; i <= q; i++) { int l, r; cin >> l >> r; Q[r].pb({l, i}); } // 0 : - + // 1 : + - fill(ans+1, ans +q + 1, -1); Build(); for (int i = 1; i <= n; i++) { for (pii u : R[i]) { if (u.F) { Set(0, u.S, -h[u.S]); Set(1, u.S, h[u.S]); } else { Set(0, u.S, -INF); Set(1, u.S, -INF); } } Upd(0, L[i].F, L[i].S + 1, h[i]); Upd(1, L[i].F, L[i].S + 1, -h[i]); // cout << "\n" << h[i] << '\n'; for (pii u : Q[i]) { maxs(ans[u.S], Get(0, u.F, i)); maxs(ans[u.S], Get(1, u.F, i)); } } for (int i = 1; i <= q; i++) cout << ans[i] << '\n'; } int32_t main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); int _ = 1; // cin >> _; while (_--) _solve(); return 0.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...