Submission #1187987

#TimeUsernameProblemLanguageResultExecution timeMemory
1187987esomerBouquet (EGOI24_bouquet)C++20
100 / 100
66 ms15888 KiB
#include <bits/stdc++.h>

using namespace std;

struct segTree {
	vector<int> v;
	int sz;
	void init (int n) {
		sz = 1;
		while (sz < n) sz *= 2;
		v.assign(2 * sz, 0);
	}
	void set(int i, int val, int x, int lx, int rx) {
		if (rx - lx == 1) {
			v[x] = max(v[x], val);
			return;
		}
		int m = (lx + rx) / 2;
		if (i < m) set(i, val, 2 * x + 1, lx, m);
		else set(i, val, 2 * x + 2, m, rx);
		v[x] = max(v[2 * x + 1], v[2 * x + 2]);
	}
	void set(int i, int val) {
		set(i, val, 0, 0, sz);
	}
	int calc(int l, int r, int x, int lx, int rx) {
		if (lx >= l && rx <= r) return v[x];
		else if (lx >= r || rx <= l) return 0;
		int m = (lx + rx) / 2;
		return max(calc(l, r, 2 * x + 1, lx, m), calc(l, r, 2 * x + 2, m, rx));
	}
	int calc(int l, int r) {
		return calc(l, r, 0, 0, sz);
	}
};

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	int N; cin >> N;
	vector<int> l(N), r(N);
	for (int i = 0; i < N; i++) cin >> l[i] >> r[i];
	vector<vector<int>> upd(N); //all the nodes that have to be updated when I calc node i.
	for (int i = 0; i < N; i++) {
		if (i - l[i]- 1 >= 0) upd[i - l[i] - 1].push_back(i);
	}
	vector<int> dp(N, 0);
	segTree st; st.init(N+1);
	int ans = 0;
	for (int i = 0; i < N; i++) {
		ans = max(ans, dp[i] + 1);
		st.set(min(N, i + r[i] + 1), dp[i] + 1);
		for (int x : upd[i]) {
			dp[x] = st.calc(0, x+1);
		}
	}
	cout << ans << "\n";
}
#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...