Submission #1296850

#TimeUsernameProblemLanguageResultExecution timeMemory
1296850ciao_gioThe short shank; Redemption (BOI21_prison)C++20
100 / 100
1738 ms343416 KiB
#include <bits/stdc++.h> // #pragma GCC optimize("O3") using namespace std; struct Segment { int n; vector<array<int, 2>> t; Segment() {} Segment(int _n) : n(_n), t(2 * n) { for (int i = 0; i < n; i++) { t[i + n] = {-1, i}; } for (int i = n - 1; i > 0; i--) { t[i] = max(t[2 * i], t[2 * i + 1]); } } void update(int i) { for (t[i += n][0]++; i > 1; i /= 2) { t[i / 2] = max(t[i], t[i ^ 1]); } } int query(int l, int r) { array<int, 2> ans = {-1, -1}; for (l += n, r += n; l < r; l /= 2, r /= 2) { if (l & 1) ans = max(ans, t[l++]); if (r & 1) ans = max(ans, t[--r]); } return ans[1]; } }; int infetti(int N, int D, int S, vector<int> t) { Segment T(N); vector<int> dp(N, 0); int ans = 0; unordered_map<int, vector<int>> M; set<int> R; for (int i = 0; i < N; i++) { if (t[i] <= S) { R.insert(i); M[i + S - t[i]].push_back(i); for (int j: M[i]) { R.erase(j); } T.update(i); } else { if (R.empty()) { ans++; } else { int x = *prev(R.end()); int y = T.query(x, i); T.update(y); dp[y]++; } for (int j: M[i]) { R.erase(j); } } } sort(begin(dp), end(dp), [&] (int i, int j) { return i > j; }); for (int i = 0; i < min(N, D); i++) { ans += dp[i]; } return N - ans; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int N, D, T; cin >> N >> D >> T; vector<int> t(N); for (int i = 0; i < N; i ++) cin >> t[i]; cout << infetti(N, D, T, t) << '\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...