Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define left jkggh
- #define right fbjflkg
- #define ll long long
- #define db long double
- #define x first
- #define y second
- #define mp make_pair
- #define pb push_back
- #define all(a) a.begin(), a.end()
- using namespace std;
- struct Line{
- int l; int r;
- bool special;
- };
- bool cmp(Line &a, Line &b) {
- return (a.r < b.r);
- }
- short dp[8003][8003][2];
- bool sat(Line &right, Line &left) {
- if (left.l < right.l && left.r > right.l && right.r > left.r) return true;
- return false;
- }
- int main(){
- #ifdef LOCAL
- freopen("E_input.txt", "r", stdin);
- //freopen("E_output.txt", "w", stdout);
- #endif
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- int n, l;
- cin >> n >> l;
- l--;
- vector<Line> v;
- for (int i = 0; i < n; ++i) {
- int x, y;
- cin >> x >> y;
- v.push_back({x, y, false});
- v.push_back({y+1, y+l+1, true});
- v.push_back({x+1, x+l+1, true});
- v.push_back({x-l+1, x+1, true});
- }
- sort(v.begin(), v.end(), cmp);
- for (int i = 0; i < v.size(); ++i) {
- dp[i][0][v[i].special] = 1;
- int L = 0, R = v.size() + 1;
- while (R-L>1) {
- int M = (L+R)/2;
- if (v[M-1].r < v[i].l) L = M;
- else R = M;
- }
- int take = L;
- for (int j = 0; j < i; ++j) {
- if (!sat(v[i], v[j])) continue;
- for (int was = 0; was <= 1; ++was) {
- int T = was + v[i].special;
- if (T==2) continue;
- dp[i][j+1][T] = dp[j][take][was] + 1;
- }
- }
- for (int k = 0; k < 2; ++k) {
- for (int j = 1; j <= i; ++j) {
- dp[i][j][k] = max(dp[i][j][k], dp[i][j-1][k]);
- }
- }
- }
- short mx = 0;
- for (int i = 0; i < v.size(); ++i) {
- mx = max(mx, dp[i][i][0]);
- mx = max(mx, dp[i][i][1]);
- }
- cout << mx;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement