제출 #419463

#제출 시각아이디문제언어결과실행 시간메모리
419463model_codeFinancial Report (JOI21_financial)C++17
100 / 100
758 ms24120 KiB
#include <set>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
class RMQ {
private:
	int sz;
	std::vector<int> val;
public:
	RMQ() : sz(0), val() {};
	RMQ(int N) {
		sz = 1;
		while(sz < N) {
			sz *= 2;
		}
		val = vector<int>(sz * 2, 0);
	}
	void update(int pos, int x) {
		pos += sz;
		val[pos] = x;
		while(pos > 1) {
			pos >>= 1;
			val[pos] = max(val[pos * 2], val[pos * 2 + 1]);
		}
	}
	int rangemax(int l, int r) {
		l += sz; r += sz;
		int ans = 0;
		while(l != r) {
			if(l & 1) ans = max(ans, val[l++]);
			if(r & 1) ans = max(ans, val[--r]);
			l >>= 1; r >>= 1;
		}
		return ans;
	}
};
int solve(int N, int D, vector<int> A) {
	vector<int> perm(N);
	for(int i = 0; i < N; ++i) {
		perm[i] = i;
	}
	sort(perm.begin(), perm.end(), [&](int i, int j) {
		return A[i] != A[j] ? A[i] < A[j] : i > j;
	});
	RMQ seg(N);
	set<int> st;
	st.insert(-1);
	st.insert(N);
	set<int> barrier;
	for(int i = 0; i < N - D; ++i) {
		barrier.insert(i);
	}
	for(int i : perm) {
		set<int>::iterator it = st.lower_bound(i);
		int pr = *it, pl = *(--it);
		if(pr - pl > D) {
			if(pr - i <= D) {
				for(int j = i; j <= pr; ++j) {
					barrier.erase(j);
				}
			}
			if(i - pl <= D) {
				for(int j = pl; j <= i; ++j) {
					barrier.erase(j);
				}
			}
		}
		st.insert(i);
		it = barrier.lower_bound(i);
		int leftmost = (it == barrier.begin() ? 0 : *(--it));
		int res = seg.rangemax(leftmost, i);
		seg.update(i, res + 1);
	}
	int answer = seg.rangemax(0, N);
	return answer;
}
int main() {
	cin.tie(0);
	ios_base::sync_with_stdio(false);
	int N, D;
	cin >> N >> D;
	vector<int> A(N);
	for(int i = 0; i < N; ++i) {
		cin >> A[i];
	}
	cout << solve(N, D, A) << endl;
	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...