結果
問題 |
No.409 ダイエット
|
ユーザー |
![]() |
提出日時 | 2016-08-06 01:11:16 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 38 ms / 2,000 ms |
コード長 | 1,798 bytes |
コンパイル時間 | 920 ms |
コンパイル使用メモリ | 103,464 KB |
実行使用メモリ | 7,740 KB |
最終ジャッジ日時 | 2024-06-26 09:45:46 |
合計ジャッジ時間 | 4,471 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 92 |
ソースコード
#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> //#include<cctype> #include<climits> #include<iostream> #include<string> #include<vector> #include<map> //#include<list> #include<queue> #include<deque> #include<algorithm> //#include<numeric> #include<utility> //#include<memory> #include<functional> #include<cassert> #include<set> #include<stack> #include<random> const int dx[] = {1, 0, -1, 0}; const int dy[] = {0, -1, 0, 1}; using namespace std; typedef long long ll; typedef unsigned long long ull; typedef vector<int> vi; typedef vector<ll> vll; typedef pair<int, int> pii; const int MAXN = 300300; ll dp[MAXN]; int deq[MAXN]; int N, A, B, W; bool check(int f1, int f2, int f3) { ll a1 = -(ll)B*f1, b1 = (ll)f1*A + ((ll)f1*f1+f1)/2 * B + dp[f1]; ll a2 = -(ll)B*f2, b2 = (ll)f2*A + ((ll)f2*f2+f2)/2 * B + dp[f2]; ll a3 = -(ll)B*f3, b3 = (ll)f3*A + ((ll)f3*f3+f3)/2 * B + dp[f3]; return (a2-a1) * (b3-b2) >= (b2-b1) * (a3-a2); } ll f(int j, int x) { return -(ll)B*j*x + (ll)j*A + ((ll)j*j+j)/2*B + dp[j]; } int main() { cin.tie(0); ios::sync_with_stdio(false); cin >> N >> A >> B >> W; vector<int> D(N); for (int i = 0; i < N; i++) cin >> D[i]; dp[0] = 0; int s = 0, t = 1; deq[0] = 0; for (int i = 1; i <= N; i++) { while (s+1 < t && f(deq[s], i) >= f(deq[s+1], i)) s++; dp[i] = f(deq[s], i) + D[i-1] - (ll)(i-1)*A + ((ll)i*i-i)/2*B; // 末尾から最小値を取る可能性がなくなったものを取り除く while (s+1 < t && check(deq[t-2], deq[t-1], i)) t--; deq[t++] = i; } ll ans = 1ll<<60; for (int i = 0; i <= N; i++) { ll d = N-i; ans = min(ans, dp[i]+B*(d+1)*d/2 - A*d); } cout << ans+W << endl; return 0; }