Submission #1204667

#TimeUsernameProblemLanguageResultExecution timeMemory
1204667ducksaysquackFinancial Report (JOI21_financial)C++20
17 / 100
941 ms52056 KiB
#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);
	//for(auto i:r) cout << i << ' '; cout << '\n';
	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-1;
	//for(auto i:r) cout << i << ' '; cout << '\n';
	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++) {
		//cout << -w[i].f << ' ' << w[i].s << ' ' << r[w[i].s] << ' ' << max(-dp.prod(1,0,n-1,w[i].s,r[w[i].s]),0LL)+1 << '\n';
		dp.upd(1,0,n-1,w[i].s,-max(-dp.prod(1,0,n-1,w[i].s,r[w[i].s]),0LL)-1);
		
	}
	cout << -dp.prod(1,0,n-1,0,n-1);
}





#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...