結果
| 問題 |
No.409 ダイエット
|
| コンテスト | |
| ユーザー |
Div9851
|
| 提出日時 | 2020-02-27 00:29:55 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,226 bytes |
| コンパイル時間 | 1,607 ms |
| コンパイル使用メモリ | 175,068 KB |
| 実行使用メモリ | 8,008 KB |
| 最終ジャッジ日時 | 2024-10-13 15:38:57 |
| 合計ジャッジ時間 | 7,080 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 57 WA * 35 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template <typename T, bool isInc = true, bool isMin = true>
struct ConvexHullTrickAddMonotone {
using P = pair<T, T>;
deque<P> H;
bool empty() const { return H.empty(); }
void clear() { H.clear(); }
inline int sgn(T x) { return x == 0 ? 0 : (x < 0 ? -1 : 1); }
using D = long double;
inline bool check(const P &a, const P &b, const P &c) {
if (b.second == a.second || c.second == b.second)
return sgn(b.first - a.first) * sgn(c.second - b.second) >=
sgn(c.first - b.first) * sgn(b.second - a.second);
return D(b.first - a.first) * sgn(c.second - b.second) /
D(abs(b.second - a.second)) >=
D(c.first - b.first) * sgn(b.second - a.second) /
D(abs(c.second - b.second));
}
void add(T a, T b) {
if (!isMin) a *= -1, b *= -1;
P line(a, b);
if (empty()) {
H.emplace_front(line);
return;
}
if (isInc ^ (!isMin)) { // 傾きが単調増加
if (H.front().first == a) {
if (H.front().second <= b) return;
H.pop_front();
}
while (H.size() >= 2 && check(line, H.front(), H[1])) H.pop_front();
H.emplace_front(line);
} else { // 傾きが単調減少
if (H.back().first == a) {
if (H.back().second <= b) return;
H.pop_back();
}
while (H.size() >= 2 && check(H[H.size() - 2], H.back(), line))
H.pop_back();
H.emplace_back(line);
}
}
inline T get_y(const P &a, const T &x) { return a.first * x + a.second; }
T query(T x) {
int l = -1, r = H.size() - 1;
while ((r - l) > 1) {
int m = (l + r) / 2;
if (get_y(H[m], x) >= get_y(H[m + 1], x))
l = m;
else
r = m;
}
if (isMin) return get_y(H[r], x);
return -get_y(H[r], x);
}
T query_monotone_inc(T x) {
while (H.size() >= 2 && get_y(H.front(), x) >= get_y(H[1], x))
H.pop_front();
if (isMin)
return get_y(H.front(), x);
else
return -get_y(H.front(), x);
}
T query_monotone_dec(T x) {
while (H.size() >= 2 && get_y(H.back(), x) >= get_y(H[H.size() - 2], x))
H.pop_back();
if (isMin)
return get_y(H.back(), x);
else
return -get_y(H.back(), x);
}
};
int main() {
int N;
ll A, B, W;
cin >> N >> A >> B >> W;
vector<ll> D(N + 1);
for (int i = 1; i <= N; i++) cin >> D[i];
vector<ll> dp(N + 1);
ConvexHullTrickAddMonotone<ll, false, true> cht;
cht.add(0, 0);
for (int i = 1; i <= N; i++) {
dp[i] = cht.query_monotone_inc(i) - A * (i - 1) + (i * i - i) / 2 * B +
D[i];
cht.add(-i * B, dp[i] + A * i + (i * i + i) / 2 * B);
}
ll ans = 1LL << 60;
for (int i = 0; i <= N; i++) {
ans = min(ans, dp[i] - A * (N - i) + (N - i) * (N - i + 1) / 2 * B + W);
}
cout << ans << endl;
}
Div9851