結果
問題 | No.409 ダイエット |
ユーザー |
|
提出日時 | 2021-10-29 12:24:08 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 426 ms / 2,000 ms |
コード長 | 2,362 bytes |
コンパイル時間 | 2,505 ms |
コンパイル使用メモリ | 201,752 KB |
最終ジャッジ日時 | 2025-01-25 08:10:45 |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 92 |
ソースコード
#include<bits/stdc++.h>using namespace std;#define rep(i,n) for(ll i=0;i<n;i++)#define repl(i,l,r) for(ll i=(l);i<(r);i++)#define per(i,n) for(ll i=(n)-1;i>=0;i--)#define perl(i,r,l) for(ll i=r-1;i>=l;i--)#define fi first#define se second#define pb push_back#define ins insert#define pqueue(x) priority_queue<x,vector<x>,greater<x>>#define all(x) (x).begin(),(x).end()#define CST(x) cout<<fixed<<setprecision(x)#define rev(x) reverse(x);using ll=long long;using vl=vector<ll>;using vvl=vector<vector<ll>>;using pl=pair<ll,ll>;using vpl=vector<pl>;using vvpl=vector<vpl>;const ll MOD=1000000007;const ll MOD9=998244353;const int inf=2e9+1;const ll INF=4e18;const ll dy[8]={-1,0,1,0,1,1,-1,-1};const ll dx[8]={0,-1,0,1,1,-1,1,-1};template <typename T> inline bool chmax(T &a, T b) {return ((a < b) ? (a = b, true) : (false));}template <typename T> inline bool chmin(T &a, T b) {return ((a > b) ? (a = b, true) : (false));}template<typename T,typename Compare=less<T>>vector<pair<int,T>> monotone_minima(int H,int W,const function<T(int,int)> &f,const Compare &comp=Compare()){vector<pair<int,T>> dp(H);function<void(int,int,int,int)> dfs=[&](int top,int bottom,int left,int right){//閉区間で実装if(top>bottom)return;int line=(top+bottom)/2;T val=f(line,left);int idx=left;for(int i=left;i<=right;i++){T nowval=f(line,i);if(comp(nowval,val)){val=nowval;idx=i;}}dp[line]=make_pair(idx,val);dfs(top,line-1,left,idx);dfs(line+1,bottom,idx,right);};dfs(0,H-1,0,W-1);return dp;}ll n,a,b,w;vl dp,d,fin;ll basej,basei;auto fx=[](ll i,ll j){ll len=(basei+i)-(basej+j)-1;return dp[basej+j]-a*len+len*(len+1)/2*b;};void induce(ll l,ll m,ll r){basei=m;basej=l;for(int i=l;i<m;i++){if(!fin[i]){dp[i]+=d[i];fin[i]=1;}}auto ans=monotone_minima<ll>(r-m,m-l,fx);for(int i=m;i<r;i++){chmin(dp[i],ans[i-m].second);}}void solve(ll l,ll r){if(l+1==r)return;ll m=(l+r)/2;solve(l,m);induce(l,m,r);solve(m,r);}int main(){cin >> n >> a >> b >> w;d.resize(n+2);dp.resize(n+2,INF);fin.resize(n+2);dp[0]=w;rep(i,n)cin >> d[i+1];solve(0,n+2);cout << dp.back() << endl;}