Submission #392808

#TimeUsernameProblemLanguageResultExecution timeMemory
392808vaavenTwo Antennas (JOI19_antennas)C++14
100 / 100
1344 ms59480 KiB
#pragma GCC target("avx2") #pragma GCC optimize("O3") #include <iostream> #include <vector> #include <algorithm> #include <math.h> #include <set> #include <stack> #include <iomanip> #include <bitset> #include <map> #include <cassert> #include <array> #include <queue> #include <cstring> #include <random> #include <unordered_set> #include <unordered_map> #define pqueue priority_queue #define pb(x) push_back(x) // #define endl '\n' #define all(x) x.begin(), x.end() #define int long long using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef vector<int> vi; typedef vector<vector<int> > vvi; // typedef tuple<ll, ll, ll> tiii; typedef pair<int, int> pii; typedef vector<pair<int, int> > vpii; typedef vector<bool> vb; typedef vector<string> vs; typedef vector<char> vc; const int inf = 1e9 + 228; const int infll = 1e18; const ll mod = 1e9 + 7; const ll mod2 = 998244353; const ld eps = 1e-14; void fast_io(){ ios_base::sync_with_stdio(0); cin.tie(0); // freopen("inputik.txt", "r", stdin); // freopen("outputik.txt", "w", stdout); } const int maxn = 2e5 + 228; int t[maxn*4]; int mx[maxn*4]; int lzupd[maxn*4]; int H[maxn], A[maxn], B[maxn]; int n, q; int L[maxn], R[maxn]; int ans[maxn]; void push(int v, int l, int r){ if(lzupd[v] != infll){ // cout << 1 << endl; // cout << v << ": " << t[v] << " -> " << t[v] << endl; t[v] = max(t[v], mx[v] - lzupd[v]); if(l != r){ lzupd[v*2] = min(lzupd[v*2], lzupd[v]); lzupd[v*2+1] = min(lzupd[v*2+1], lzupd[v]); } lzupd[v] = infll; } } void upd(int v, int l, int r, int k){ push(v, l, r); if(l == r){ if(mx[v] == -infll){ mx[v] = H[l]; } else{ mx[v] = -infll; } } else{ int mid = (l+r)/2; if(k <= mid){ upd(v*2, l, mid, k); } else{ upd(v*2+1, mid+1, r, k); } // push(v*2, l, mid); // push(v*2+1, mid+1, r); mx[v] = max(mx[v*2], mx[v*2+1]); // t[v] = max(t[v*2], t[v*2+1]); } } void sett(int v, int l, int r, int ql, int qr, int k){ push(v, l, r); if(ql <= l && r <= qr){ lzupd[v] = min(lzupd[v], k); push(v, l, r); } else if(ql > r || l > qr){ return; } else{ int mid = (l+r)/2; sett(v*2, l, mid, ql, qr, k); sett(v*2+1, mid+1, r, ql, qr, k); t[v] = max(t[v*2], t[v*2+1]); // mx[v] = max(mx[v*2], mx[v*2+1]); } } int get(int v, int l, int r, int ql, int qr){ push(v, l, r); if(ql <= l && r <= qr){ return t[v]; } else if(l > qr || ql > r){ return -1; } else{ int mid = (l+r)/2; return max(get(v*2, l, mid, ql, qr), get(v*2+1, mid+1, r, ql, qr)); } // cout << t[1] << endl; } void solve2(){ vvi to_add(n+1); vvi to_del(n+1); vvi posts(n+1); for(int &i:lzupd) i = infll; for(int &i:t) i = -infll; for(int &i:mx) i = -infll; for(int i=0; i<q; i++){ posts[R[i]].pb(i); } for(int i=0; i<n; i++){ if(i + A[i] < n){ to_add[i + A[i]].pb(i); to_del[min(i + B[i] + 1, n)].pb(i); } for(int j:to_add[i]) upd(1, 0, maxn, j); for(int j:to_del[i]) upd(1, 0, maxn, j); if(i - A[i] >= 0){ sett(1, 0, maxn, max(i - B[i], 0ll), i - A[i], H[i]); } for(int j:posts[i]){ // cout << L[j] << " " << R[j] << " " << get(1, 0, maxn, L[j], R[j]) << endl; ans[j] = max(ans[j], get(1, 0, maxn, L[j], R[j])); } } } void solve(){ cin >> n; for(int i=0; i<n; i++){ cin >> H[i] >> A[i] >> B[i]; } for(int &i:ans) i = -1; // int q; cin >> q; for(int i=0; i<q; i++){ cin >> L[i] >> R[i]; L[i]--, R[i]--; } solve2(); for(int &i:H) i = -i; solve2(); for(int i=0; i<q; i++) cout << ans[i] << endl; } /* 5 10 2 4 1 1 1 2 1 3 1 1 1 100 1 1 5 1 2 2 3 1 3 1 4 1 5 ======= 20 260055884 2 15 737689751 5 5 575359903 1 15 341907415 14 14 162026576 9 19 55126745 10 19 95712405 11 14 416027186 8 13 370819848 11 14 629309664 4 13 822713895 5 15 390716905 13 17 577166133 8 19 195931195 10 17 377030463 14 17 968486685 11 19 963040581 4 10 566835557 1 12 586336111 6 16 385865831 8 9 1 1 20 */ signed main(){ fast_io(); // ;(time(NULL)); cout << fixed << setprecision(10); int q = 1; // cin >> q; while(q--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...