思路:
最长上升子序列
先差分数组染色
如果存在一个点,被所有区间包含,那么这张图一定是山峰状,如下图:
那么只要分别从前和从后找一个最长非严格上升子序列,然后从前往后更新就可以找出最大的山峰序列的长度,这个就是答案
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) const int N=1e5+5; const int INF=0x3f3f3f3f; int a[N],dp[N],pre[N],suf[N]; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n,m,l,r; cin>>n>>m; for(int i=1;i<=n;i++)cin>>l>>r,a[l]++,a[r+1]--; for(int i=2;i<=m;i++)a[i]+=a[i-1]; mem(dp,INF); for(int i=1;i<=m;i++){ *upper_bound(dp+1,dp+m+1,a[i])=a[i]; pre[i]=lower_bound(dp+1,dp+m+1,INF)-dp-1; } mem(dp,INF); for(int i=m;i>=1;i--){ *upper_bound(dp+1,dp+m+1,a[i])=a[i]; suf[i]=lower_bound(dp+1,dp+m+1,INF)-dp-1; } int ans=0; for(int i=0;i<=m;i++)ans=max(ans,pre[i]+suf[i+1]); cout<<ans<<endl; return 0; }