#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define ll long long
using namespace std;
int segment[524288], dp[200000];
void seginsert(int val, int pos) {
pos += 262144;
segment[pos] = val;
pos /= 2;
while (pos > 0) {
segment[pos] = max(segment[pos*2 + 1], segment[pos*2]);
pos /= 2;
}
}
int segquery(int l, int r) {
l += 262144; r += 262144;
int val = 0;
while (l <= r) {
if (l % 2 == 1) {val = max(val, segment[l++]);}
if (r % 2 == 0) {val = max(val, segment[r--]);}
l /= 2; r /= 2;
}
return val;
}
int main() {
int n; cin >> n;
vector<pair<int,int>> ranges(n);
for (int i=0;i<n;i++) {
cin >> ranges[i].ff >> ranges[i].ss;
}
vector<vector<int>> ends(n + 1);
for (int i=0;i<n;i++) {
ends[min(ranges[i].ss + i + 1, n)].pb(i);
}
for (int i=0;i<524288;i++) {
segment[i] = 0;
}
int tempdp;
dp[0] = 1;
for (int i=1;i<n;i++) {
for (int j: ends[i]) {
seginsert(dp[j], j);
}
dp[i] = 1 + segquery(0, i - ranges[i].ff - 1);
}
int ans = 0;
for (int i=0;i<n;i++) {
ans = max(ans, dp[i]);
}
cout << ans;
}
# | 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... |