제출 #583132

#제출 시각아이디문제언어결과실행 시간메모리
583132LucppTwo Antennas (JOI19_antennas)C++17
100 / 100
947 ms35456 KiB
#include <bits/stdc++.h> using namespace std; const int INF = 1e9+1; const int MAX = 2e5; const int cap = 1<<18; struct Data{ int val = -INF, hmin = INF; }; Data combine(Data a, Data b){ return {max(a.val, b.val), min(a.hmin, b.hmin)}; } Data S[2*cap]; int O[2*cap]; bool lazy[2*cap]; void init(){ memset(lazy, 0, sizeof(lazy)); fill_n(O, 2*cap, -INF); fill_n(S, 2*cap, Data()); } void apply(int i, int u){ S[i].val = max(S[i].val, u-S[i].hmin); O[i] = max(O[i], u); lazy[i] = true; } void push(int i){ if(lazy[i]){ apply(2*i, O[i]); apply(2*i+1, O[i]); O[i] = -INF; lazy[i] = false; } } void update(int l, int r, int u, int a = 1, int b = cap, int i = 1){ if(l <= a && b <= r) apply(i, u); else if(b < l || r < a); else{ push(i); int m = (a+b)/2; update(l, r, u, a, m, 2*i); update(l, r, u, m+1, b, 2*i+1); S[i] = combine(S[2*i], S[2*i+1]); } } void updH(int p, int h, int a = 1, int b = cap, int i = 1){ if(a == b){ S[i].hmin = h; return; } push(i); int m = (a+b)/2; if(p <= m) updH(p, h, a, m, 2*i); else updH(p, h, m+1, b, 2*i+1); S[i] = combine(S[2*i], S[2*i+1]); } Data qry(int l, int r, int a = 1, int b = cap, int i = 1){ if(l <= a && b <= r) return S[i]; if(b < l || r < a) return Data(); push(i); int m = (a+b)/2; return combine(qry(l, r, a, m, 2*i), qry(l, r, m+1, b, 2*i+1)); } int N, Q; int A[MAX], B[MAX], H[MAX], ans[MAX]; vector<pair<int, int>> todo[MAX], queries[MAX]; void solve(){ init(); for(int R = 0; R < N; R++){ for(auto [i, op] : todo[R]) { if(op == 1) updH(i+1, H[i]); else updH(i+1, INF); } if(R-A[R] >= 0){ int l = max(0, R-B[R]), r = R-A[R]; update(l+1, r+1, H[R]); } for(auto [L, ind] : queries[R]){ ans[ind] = max(ans[ind], qry(L+1, R+1).val); } } } int main(){ cin >> N; for(int i = 0; i < N; i++){ cin >> H[i] >> A[i] >> B[i]; if(i+A[i] < N) todo[i+A[i]].emplace_back(i, 1); if(i+B[i]+1 < N) todo[i+B[i]+1].emplace_back(i, -1); } cin >> Q; fill_n(ans, Q, -1); for(int i = 0; i < Q; i++){ int L, R; cin >> L >> R; L--; R--; queries[R].emplace_back(L, i); } solve(); for(int i = 0; i < N; i++) H[i] = -H[i]; solve(); for(int i = 0; i < Q; i++) 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...