結果
問題 | No.409 ダイエット |
ユーザー |
![]() |
提出日時 | 2025-05-14 02:59:00 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 39 ms / 2,000 ms |
コード長 | 1,327 bytes |
コンパイル時間 | 3,623 ms |
コンパイル使用メモリ | 280,772 KB |
実行使用メモリ | 7,844 KB |
最終ジャッジ日時 | 2025-05-14 02:59:09 |
合計ジャッジ時間 | 8,685 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 92 |
ソースコード
#define rep(i, n) for (int i = 0; i < (int)(n); i++) #define ALL(v) v.begin(), v.end() typedef long long ll; #include <bits/stdc++.h> using namespace std; template <class T> using V=vector<T>; template <class T> using VV=V<V<T>>; template<typename T> class ConvexHullTrick{ struct F{ T a,b; F(T a,T b):a(a),b(b){} }; deque<F> deq; bool check(F &f1,F &f2,F &f3){ return (f2.a-f1.a)*(f3.b-f2.b)>=(f2.b-f1.b)*(f3.a-f2.a); } ll f(F &f1,T x){return f1.a*x+f1.b;} public: // a_{prev} >= a void add_line(T a,T b){ F f1=F(a,b); while(deq.size()>=2 && check(deq[deq.size()-2],deq[deq.size()-1],f1)){ deq.pop_back(); } deq.push_back(f1); } // x_{prev} <= x ll query(T x){ while(deq.size()>=2 && f(deq[0],x)>=f(deq[1],x)){ deq.pop_front(); } return f(deq[0],x); } deque<F> get_deq(){ return deq; } }; int main(){ ios::sync_with_stdio(false); std::cin.tie(nullptr); ll n,a,b,w; cin>>n>>a>>b>>w; V<ll> D(n+1); rep(i,n) cin>>D[i+1]; ConvexHullTrick<ll> cht; cht.add_line(0,0); V<ll> dp(n+1); for(ll i=1;i<=n;i++){ dp[i]=cht.query(i)+a*(1-i)+i*(i-1)/2*b+D[i]; cht.add_line(-b*i,dp[i]+a*i+i*(i+1)/2*b); } ll mi=1e18; rep(i,n+1) mi=min(mi,dp[i]-(n-i)*a+(n-i)*(n-i+1)/2*b+w); cout<<mi<<endl; return 0; }