#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pll pair<int, int>
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define endl '\n'
signed main(){
int n,m;cin>>n>>m;
set<pair<int,int>> s;
vector<int> dp0(n+1, 1e9), v(n+1, 0), dp1(n+1, 1e9);
dp0[0]=0,dp1[0]=0;
for(int i=1;i<=n;i++)cin>>v[i];
s.insert({0, 0});
int mn=0;
for(int i=1;i<=n;i++){
pair<int,int> q={v[i]-i*m, -1e15};
auto it=s.lower_bound(q);
int cand=1e15;
//~ printf("q.f %lld\n", q.f);
//~ for(auto it:s)cout<<"( "<<it.f<<" "<<it.s<<" ) "<<endl;
if(it!=s.end()){
cand=min(cand, i-1+(*it).s);
//~ printf("%lld <-- cand\n", cand);
auto d=s.upper_bound(q);
while(d != s.begin() and (*prev(d)).s >= cand-i){
s.erase(prev(d));
}
pair<int,int> u={v[i]-i*m, cand-i};
s.insert(u);
}
dp0[i]=cand;
dp1[i]=mn+i;
mn=min(mn, dp0[i]-i);
//~ printf("i %lld, dp0 %lld dp1 %lld\n", i, dp0[i], dp1[i]);
}
cout<<min(dp0[n], dp1[n]);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |