제출 #1029337

#제출 시각아이디문제언어결과실행 시간메모리
1029337MDarioThe short shank; Redemption (BOI21_prison)C++17
25 / 100
2088 ms20048 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 = 300'000; const ll MOD = 1'000'000'007; int main() { ios_base::sync_with_stdio(0); cin.tie(0); ll n, D, T; cin >> n >> D >> T; ll a[n]; for (int i = 0; i < n; i++) cin >> a[i]; if (D == 1) { 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; // cout << c << " "; } // cout << "\n"; } 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; } // for (int i = 0; i < n; i++) // cout << suf[i] << " "; // cout << "\n"; } ll ans = n; for (int i = 0; i + 1 < n; i++) ans = min(ans, pref[i] + suf[i + 1]); cout << ans << "\n"; return 0; } int dp[n][2]; { 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++) { // cout << dp[t][cur] << " "; 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 << "\n"; } cout << dp[n - 1][D & 1] << "\n"; 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...