Submission #335747

#TimeUsernameProblemLanguageResultExecution timeMemory
335747nafis_shifatDischarging (NOI20_discharging)C++14
100 / 100
446 ms25868 KiB
#include<bits/stdc++.h> #define ll long long #define pii pair<int,int> using namespace std; const int mxn=1e6+5; const ll inf=1e18; vector<ll> m,b; ll f(int i, ll x) { return m[i] * x + b[i]; } bool bad(int f1,int f2,int f3) { return __int128(b[f3] - b[f1]) * (m[f1] - m[f2]) <= __int128(b[f2] - b[f1]) * (m[f1] - m[f3]); } void add(ll m_, ll b_) { m.push_back(m_); b.push_back(b_); int sz = m.size(); while(sz >=3 && bad(sz-3,sz-2,sz-1)) { m.erase(m.end() - 2); b.erase(b.end() - 2); sz--; } } ll query(ll x) { ll ans = inf; int lo = 0; int hi = m.size() - 1; while(lo <= hi) { int mid1 = lo + (hi - lo) / 3; int mid2 = hi - (hi - hi) / 3; ll v1 = f(mid1,x); ll v2 = f(mid2,x); if(v1 <= v2) { ans = min(ans,v1); hi = mid2 - 1; } else { ans = min(ans,v2); lo = mid1 + 1; } } return ans; } int main() { int n; cin>>n; ll t[n+1]; for(int i = 1; i <= n; i++) cin>>t[i]; ll dp[n+1]; dp[0] = 0; add(0,0); ll cm = 0; int lp = 1; for(int i = 1; i <= n; i++) { if(t[i] >= cm) { cm = t[i]; for(; lp < i; lp++) { add(-lp,dp[lp]); } } dp[i] = query(cm) + cm * n; } cout<<dp[n]<<endl; }
#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...