제출 #1102121

#제출 시각아이디문제언어결과실행 시간메모리
1102121MateiKing80The short shank; Redemption (BOI21_prison)C++14
100 / 100
1600 ms90704 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pll = pair<ll, ll>; const ll INF = (ll)1e18 + 10; int n, d, t; vector<int> T; struct ura { int pos, inc; pll minn, seg; }; pll faDP(ll lambda) { stack<ura> U; pll seg; U.push({-1, 0, {INF, -1}, {INF, -1}}); if (T[n - 1] > t) { U.push({n - 1, 0, {0, 0}, {0, 0}}); seg = {INF, 0}; } else seg = {1, 0}; for (int i = n - 2; i >= 0; i --) { pll m = min(seg, U.top().minn); pll v = m; v.first += lambda; v.second ++; seg = min(seg, v); if (T[i] > t) { U.push({i, 0, m, seg}); seg = {INF, 0}; } else { int diff = t - T[i]; seg.first ++; U.top().inc ++; U.top().minn.first ++; U.top().seg.first ++; while (U.size() > 1 && (U.top().pos - i) <= diff) { U.top().seg.first ++; seg = min(seg, U.top().seg); int inc = U.top().inc + 1; U.pop(); U.top().inc += inc; U.top().minn.first += inc; U.top().seg.first += inc; } } } return min(seg, U.top().minn); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> n >> d >> t; T = vector<int>(n); for(int i = 0; i < n; i ++) cin >> T[i]; ll l = 0; ll r = 4e6; ll c, x; while(l != r) { ll mid = (l + r) / 2; x = faDP(mid).second; if (x > d) l = mid + 1; else r = mid; } tie(c, x) = faDP(l); cout << c - d * l << endl; return 0; }
#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...