#include <bits/stdc++.h>
#define int long long
#define f first
#define s second
using namespace std;
const int M = 1e18;
template<int e> struct segtree {
vector<int> v, a;
void resz(int n, vector<int> w) {v.assign(4*n,e); a = w;}
void init(int k, int l, int r) {
if(l > r) return;
if(l == r) v[k] = a[l];
else {
int m = (l+r)/2;
init(2*k,l,m); init(2*k+1,m+1,r);
v[k] = min(v[2*k],v[2*k+1]);
}
}
void upd(int k, int l, int r, int p, int x) {
if(l > r) return;
if(l == r) {v[k] = x; return;}
int m = (r+l)/2;
if(p <= m) upd(2*k,l,m,p,x);
else upd(2*k+1,m+1,r,p,x);
v[k] = min(v[2*k],v[2*k+1]);
}
int prod(int k, int x, int y, int l, int r) {
if(l == x && y == r) return v[k];
if(l > r) return e;
int m = (x+y)/2;
return min(prod(2*k,x,m,l,min(m,r)),prod(2*k+1,m+1,y,max(l,m+1),r));
}
};
signed main() {
int n, k; cin >> n >> k;
vector<int> v(n); for(int i=0;i<n;i++) cin >> v[i];
segtree<M> st, rt, dp; st.resz(n,v); st.init(1,0,n-1);
vector<int> r(n); for(int i=0;i<n-k+1;i++) r[i] = st.prod(1,0,n-1,i,i+k-1);
rt.resz(n-k+1,r); rt.init(1,0,n-k);
for(int i=0;i<n-k;i++) {
int l = i+1, u = n-k;
while(l<u) {
int m = (l+u)/2;
if(rt.prod(1,0,n-1,i+1,m) > v[i]) u = m;
else l = m+1;
}
r[i] = l;
}
for(int i=n-k;i<n;i++) r[i] = n-k;
vector<pair<int,int>> w; for(int i=0;i<n;i++) w.push_back({-v[i],i});
sort(begin(w),end(w)); vector<int> d(n,M);
dp.resz(n,d);
for(int i=0;i<n;i++) dp.upd(1,0,n-1,w[i].s,-max(-dp.prod(1,0,n-1,w[i].s,r[w[i].s]+k-1),0LL)-1);
cout << -dp.prod(1,0,n-1,0,n-1);
}
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |