Submission #738911

#TimeUsernameProblemLanguageResultExecution timeMemory
738911vjudge1Safety (NOI18_safety)C++17
100 / 100
103 ms7008 KiB
#include <bits/stdc++.h> #define ll long long #define fi first #define se second #define fastio ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); using namespace std; const ll MOD=998244353; ll N,M,a[200005]; struct SlopeTrick{ ll minimum=0,negStart=0,posStart=0; priority_queue <ll> negSlope; priority_queue <ll,vector<ll>,greater<ll> > posSlope; void PrefixMin(){ posStart=0; while(!posSlope.empty()){ posSlope.pop(); } } void SuffixMin(){ negStart=0; while(!negSlope.empty()){ negSlope.pop(); } } void addPos(ll x){ ll y; if(negSlope.empty()){ y=-1e18; } else{ y=negSlope.top()+negStart; } if(x>=y||negSlope.empty()){ posSlope.push(x-posStart); } else{ minimum+=y-x; negSlope.push(x-negStart); negSlope.pop(); posSlope.push(y-posStart); } } void addNeg(ll x){ ll y; if(posSlope.empty()){ y=-1e18; } else{ y=posSlope.top()+posStart; } if(x<=y||posSlope.empty()){ negSlope.push(x-negStart); } else{ minimum+=x-y; posSlope.push(x-posStart); posSlope.pop(); negSlope.push(y-negStart); } } void RangeMin(ll l, ll r){ if(!negSlope.empty()){ negStart-=r; } if(!posSlope.empty()){ posStart+=l; } } }; int main(){ cin>>N>>M; for(int i=1;i<=N;i++){ cin>>a[i]; } SlopeTrick dp=SlopeTrick(); for(int i=1;i<=N;i++){ dp.RangeMin(M,M); dp.addPos(a[i]); dp.addNeg(a[i]); } cout<<dp.minimum<<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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...