제출 #1195819

#제출 시각아이디문제언어결과실행 시간메모리
1195819DeathIsAwe선물상자 (IOI15_boxes)C++20
100 / 100
501 ms305344 KiB
#include "boxes.h" #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define ff first #define ss second #define ll long long using namespace std; ll dp[10000005], revdp[10000005], n, k, l; vector<ll> p; ll delivery(int N, int K, int L, int P[]) { n = N; k = K; l = L; #define int long long for (int i=0;i<N;i++) { if (P[i] == 0) n -= 1; else p.pb(P[i]); dp[i] = 0; revdp[i] = 0; } dp[n] = 0; revdp[n] = 0; if (n == 0) return 0; dp[0] = 0; revdp[0] = 0; for (int i=0;i<n;i++) { dp[i + 1] = min(l, 2 * p[i]) + dp[max((ll)0, i + 1 - k)]; } for (int i=0;i<n;i++) { revdp[i + 1] = min(l, 2 * (l - p[n - i - 1])) + revdp[max((ll)0, i + 1 - k)]; } ll ans = INT64_MAX, count = 0; if (l % 2 == 0) { for (int i=0;i<n;i++) { if (p[i] == l/2) count += 1; } } if (count % k != 0) { count = k * (count / k + 1); } //cout << dp[1] << ' ' << dp[2] << ' ' << dp[3] << endl; //cout << revdp[1] << ' ' << revdp[2] << ' ' << revdp[3] << endl; for (int i=-1;i<n;i++) { ans = min(ans, dp[max((ll)0, i - count + 1)] + revdp[max((ll)0, n - i - 1)] + (count / k) * l); //cout << ans << endl; } //cout << endl; count += k; for (int i=-1;i<n;i++) { ans = min(ans, dp[max((ll)0, i - count + 1)] + revdp[max((ll)0, n - i - 1)] + (count / k) * l); //cout << ans << endl; } count += k; for (int i=-1;i<n;i++) { ans = min(ans, dp[max((ll)0, i - count + 1)] + revdp[max((ll)0, n - i - 1)] + (count / k) * l); //cout << ans << endl; } if (ans == INT64_MAX) return 0; return ans; }
#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...