제출 #1029411

#제출 시각아이디문제언어결과실행 시간메모리
1029411MDarioThe short shank; Redemption (BOI21_prison)C++17
0 / 100
45 ms16980 KiB
#include <bits/stdc++.h> #include <functional> #include <vector> using namespace std; #define F first #define S second typedef long long ll; const string noyes[2] = {"NO", "YES"}; const ll INFLL = (1ll << 62); const int INF = (1 << 30); const int MAXN = 2'000'000; const ll MOD = 1'000'000'007; ll n, D, T; ll a[MAXN]; int dp[MAXN][2]; void subtask_1() { { int c = 0; ll last = INF; for (int i = 0; i < n; i++) { last = min(last + 1, a[i]); c += (last <= T); dp[i][0] = c; } } for (int i = 0; i < D; i++) { int cur = i & 1; for (int t = i; t < n; t++) dp[t][cur ^ 1] = INF; for (int t = i; t < n; t++) { int c = 0; ll last = INF; for (int e = t + 1; e < n; e++) { last = min(last + 1, a[e]); c += (last <= T); dp[e][cur ^ 1] = min(dp[e][cur ^ 1], dp[t][cur] + c); } } } cout << dp[n - 1][D & 1] << "\n"; } void subtask_2() { ll pref[n]; { ll c = 0; ll last = INF; for (int i = 0; i < n; i++) { last = min(last + 1, a[i]); if (last <= T) { c++; } pref[i] = c; } } ll suf[n]; { stack<ll> slow; ll c = 0; ll last = INF; for (int i = n - 1; i >= 0; i--) { last = a[i]; slow.push(i); while (!slow.empty() && abs(i - slow.top()) + last <= T) { c++; slow.pop(); } suf[i] = c; } } ll ans = n; for (int i = 0; i + 1 < n; i++) ans = min(ans, pref[i] + suf[i + 1]); cout << ans << "\n"; return; } void subtask_3_4() { pair<int, int> f[n]; { stack<int> s; for (int i = n - 1; i >= 0; i--) { f[i] = {-1, n}; int c = 0; s.push(i); while (!s.empty() && abs(i - s.top()) + a[i] <= T) { f[s.top()] = {i, s.top() - i - c}; c++; // cout << s.top() << " " << i << "\n"; s.pop(); } } } { int c = 0; ll last = INF; for (int i = 0; i < n; i++) { last = min(last + 1, a[i]); c += (last <= T); dp[i][0] = c; // cout << dp[i][0] << " "; } // cout << "\n"; } for (int i = 1; i <= D; i++) { int cur = i & 1; int prev = cur ^ 1; int p = i; dp[i][cur] = dp[i - 1][prev] + (a[i] <= T); // cout << dp[i][cur] << " "; for (int t = i + 1; t < n; t++) { dp[t][cur] = dp[t - 1][cur] + (f[t].F > p); if (f[t].F > p) { if (dp[t][cur] > (dp[f[t].F][prev] + f[t].S)) { p = f[t].F; dp[t][cur] = (dp[f[t].F][prev] + f[t].S); } } // cout << dp[t][cur] << " "; } // cout << "\n"; } cout << dp[n - 1][D & 1] << "\n"; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> D >> T; for (int i = 0; i < n; i++) cin >> a[i]; subtask_3_4(); 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...