动态规划的思想,考虑两个状态:f[i][0] 为另起一串,该点作为开头;f[i][1] 为接上已有的不降的串。
#include <bits/stdc++.h>
#define N (int)(1e6+2)
using namespace std;
int n, l[N], r[N], ans=1;
struct node {
int pos, len;
} tot, f[N][2];
int main() {
scanf("%d", &n);
for(int i=1; i<=n; i++)
scanf("%d%d", l+i, r+i);
f[1][0].pos = l[1], f[1][0].len = 1;
f[1][1].pos = INT_MAX;
for(int i=2; i<=n; i++) {
tot.pos = INT_MAX, tot.len = 0;
if(f[i-1][0].pos <= r[i]) {
tot.pos = f[i-1][0].pos;
tot.len = f[i-1][0].len+1;
}
if(f[i-1][1].pos <= r[i]) {
if(f[i-1][1].len+1 > tot.len) {
tot.pos = f[i-1][1].pos;
tot.len = f[i-1][1].len+1;
} else if(f[i-1][1].len+1 == tot.len)
tot.pos = min(f[i-1][1].pos, tot.pos);
}
f[i][0].pos = l[i], f[i][0].len = 1;
f[i][1].pos = max(tot.pos, l[i]), f[i][1].len = tot.len;
if(tot.len > ans)
ans = tot.len;
}
printf("%d\n", ans);
return 0;
}