Submission #1132002

#TimeUsernameProblemLanguageResultExecution timeMemory
1132002NoMercyFinancial Report (JOI21_financial)C++20
100 / 100
426 ms26268 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; struct Segtree { #define left v + 1 #define right v + 2 * (tm - tl) struct pi { ll mx = 0; } emp; vector<pi> tree; void init (int x) { tree.assign (x << 1, emp); } void update (int v, int tl, int tr, int pos, ll val) { if (tl + 1 == tr) { tree[v].mx = val; return; } int tm = (tl + tr) >> 1; if (pos < tm) update (left, tl, tm, pos, val); else update (right, tm, tr, pos, val); tree[v].mx = max(tree[left].mx, tree[right].mx); } ll get (int v, int tl, int tr, int ql, int qr) { if (tl >= qr || ql >= tr) { return 0LL; } if (ql <= tl && tr <= qr) { return tree[v].mx; } int tm = (tl + tr) >> 1; return max (get (left, tl, tm, ql, qr), get (right, tm, tr, ql, qr)); } }; int32_t main () { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int N, D; cin >> N >> D; vector<ll> arr(N); vector<array<ll, 2>> events; for (int i = 0;i < N;i ++) { cin >> arr[i]; events.push_back({arr[i], -i}); } sort (events.begin(), events.end()); Segtree ST; ST.init (N + 2); set<ll> index, alive; for (auto [val, ind] : events) { ind = -ind; auto it = index.upper_bound(ind); if (it == index.begin() || *prev(it) + D < ind) { alive.insert(ind); } index.insert(ind); it = alive.upper_bound(ind); if (it != alive.end() && *it <= ind + D) { it = alive.erase(it); } ST.update (0, 0, N, ind, 1 + ST.get (0, 0, N, *prev (it), ind + 1)); } cout << ST.get (0, 0, N, 0, N) << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...