Submission #683211

#TimeUsernameProblemLanguageResultExecution timeMemory
683211NK_Financial Report (JOI21_financial)C++17
100 / 100
968 ms32856 KiB
#include <bits/stdc++.h>

using namespace std;

#define nl '\n'

const int INF = 1e9+10;
struct Seg {
	const int ID = INF; int comb(int a, int b) { return min(a, b); }
	vector<int> seg, lazy; int n;
	void init(int N) {
		n = 1; while(n < N) n *= 2;
		seg.assign(2*n, ID);
		lazy.assign(2*n, ID);
	}

	void pull(int p) { seg[p] = comb(seg[2*p], seg[2*p+1]); }

	void push(int x, int L, int R) {
		if (lazy[x] == ID) return;
		// cout << "LAZY: " << lazy[x] << " " << x << " " << L << " " << R << nl;
		seg[x] = lazy[x];
		// cout << seg[x] << nl;
		if (L != R) for(int i = 0; i < 2; i++) lazy[2*x+i] = lazy[x];
		lazy[x] = ID;
	}

	void upd(int l, int r, int v, int x, int L, int R) {
		push(x, L, R); if (r < L || R < l) return;
		if (l <= L && R <= r) {
			lazy[x] = v;
			push(x, L, R);
			return;
		}
		int M = (L+R)/2;
		upd(l, r, v, 2*x, L, M);
		upd(l, r, v, 2*x+1, M+1, R);
		pull(x);
	}

	int query(int l, int r, int x, int L, int R) {
		push(x, L, R); if (r < L || R < l) return ID;
		if (l <= L && R <= r) return seg[x];
		int M = (L+R)/2;
		return comb(query(l, r, 2*x, L, M), query(l, r, 2*x+1, M+1, R));
	}
	

	int get() { return seg[1]; };
	void upd(int l, int r, int v) { upd(l, r, v, 1, 0, n-1); }
	// void set(int p, int v) { set(p, v, 1, 0, n-1); }
	int query(int l, int r) { return query(l, r, 1, 0, n-1); }
};

int main() {
	cin.tie(0)->sync_with_stdio(0);
	
	int N, K; cin >> N >> K;

	vector<int> A(N); for(auto &x : A) cin >> x;


	int M = -1;
	{	
		map<int, int> mp; int cur = 0;
		for(auto x : A) mp[x]++;
		for(auto &p : mp) p.second = cur++;
		for(auto &x : A) x = mp[x];
		M = cur;
	}


	Seg st; st.init(N);
	for(int i = 0; i < N; i++) st.upd(i, i, A[i]);

	Seg dp; dp.init(M); dp.upd(0, M-1, 0);

	for(int i = 0; i < N; i++) {
		int best = max(0, -dp.query(0, A[i]-1)) + 1;
		best = max(best, -dp.query(A[i], A[i]));
		dp.upd(A[i], A[i], -best);


		int mn = st.query(max(0, i-K+1), i);
		dp.upd(0, mn-1, 0);
	}

	cout << -dp.query(A.back(), M-1) << nl;


    return 0;
}
#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...