Submission #734217

#TimeUsernameProblemLanguageResultExecution timeMemory
734217pavementThe short shank; Redemption (BOI21_prison)C++17
100 / 100
1972 ms524288 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; //~ #define int long long #define mp make_pair #define mt make_tuple #define pb push_back #define ppb pop_back #define eb emplace_back #define g0(a) get<0>(a) #define g1(a) get<1>(a) #define g2(a) get<2>(a) #define g3(a) get<3>(a) #define g4(a) get<4>(a) mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); using db = double; using ll = long long; using ld = long double; using ii = pair<int, int>; using iii = tuple<int, int, int>; using iiii = tuple<int, int, int, int>; using iiiii = tuple<int, int, int, int, int>; template<class key, class value = null_type, class cmp = less<key> > using ordered_set = tree<key, value, cmp, rb_tree_tag, tree_order_statistics_node_update>; int N, D, T, ans, t[2000005], l[2000005]; bool seen[2000005]; stack<ii> st; struct node *root; struct node { node *left, *right; int S, E, pv; ii val; vector<int> vec; node(int _s, int _e) : S(_s), E(_e), pv(0) { if (S == E) { val = mp(0, S); return; } int M = (S + E) >> 1; left = new node(S, M); right = new node(M + 1, E); val = max(left->val, right->val); } void prop() { if (S == E || !pv) return; left->val.first += pv; left->pv += pv; right->val.first += pv; right->pv += pv; pv = 0; } void upd(int l, int r, int v) { if (l > E || r < S) return; if (l <= S && E <= r) { val.first += v; pv += v; return; } prop(); left->upd(l, r, v); right->upd(l, r, v); val = max(left->val, right->val); } void add(int l, int r, int idx) { if (l > E || r < S) return; if (l <= S && E <= r) { vec.pb(idx); return; } left->add(l, r, idx); right->add(l, r, idx); } void get_all(int p) { for (auto i : vec) { if (seen[i]) continue; seen[i] = 1; root->upd(l[i], i, -1); } vec.clear(); if (S == E) return; int M = (S + E) >> 1; prop(); if (p <= M) left->get_all(p); else right->get_all(p); } }; main() { ios::sync_with_stdio(0); cin.tie(0); cin >> N >> D >> T; for (int i = 1; i <= N; i++) { cin >> t[i]; } root = new node(1, N); for (int i = 1; i <= N; i++) { // find max j such that // t[j] + i - j <= T // t[j] - j <= T - i while (!st.empty() && st.top().first >= t[i] - i) st.pop(); st.emplace(t[i] - i, i); while (!st.empty() && st.top().first > T - i) st.pop(); if (st.empty()) ans--; else if (st.top().second + 1 <= i) { l[i] = st.top().second + 1; root->upd(l[i], i, 1); root->add(l[i], i, i); } } ans += N; while (D--) { auto cur = root->val; if (cur.first == 0) break; ans -= cur.first; root->get_all(cur.second); } cout << ans << '\n'; }

Compilation message (stderr)

prison.cpp:93:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   93 | main() {
      | ^~~~
#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...