首先可以想到我们放置这个要,满足一个条件:若l1<l2,则r1<r2,否则产生重合
于是变为在先按照l排序后寻找最长上升子序列,DP即可
AC代码
Details
#include<bits/stdc++.h>
using namespace std;
#define QAQ return
#define QWQ return 0;
#define ll long long
#define pii pair< int,int >
const int N=2e5+10;
struct seq
{
int l, r;
bool operator <( const seq &x )const
{
if( l == x.l ) QAQ r > x.r;
QAQ l < x.l;
}
}line[N];
int ans[N];
int main()
{
ios::sync_with_stdio( false );
cin.tie( nullptr ), cout.tie( nullptr );
int n;
cin>>n;
for( int i=1;i<=n;i++ ) cin>>line[i].l>>line[i].r;
sort( line+1,line+n+1 );
int m=0;
for( int i=1;i<=n;i++ )
if( line[i].r > ans[m] ) ans[++m]=line[i].r;
else ans[lower_bound( ans+1,ans+m+1,line[i].r )-ans]=line[i].r;
cout<<m;
QWQ
}
时间复杂度:O(nlogn)