提交时间:2022-07-19 12:15:55
运行 ID: 52467
#include <bits/stdc++.h> using namespace std; const int N=5e5+3; int dp[2][N]; //dp[i][j]->前i个(滚动)以j结尾的木板数,dp[i][0]->最大木板数 struct stu { int l,r; } w[N]; int Read() { int sum=0; char ch=getchar(); while(ch<'0' || ch>'9') ch=getchar(); while(ch>='0' && ch<='9') sum=sum*10+ch-'0',ch=getchar(); return sum; } bool cmp(stu a,stu b) { return a.l==b.l ? a.r>b.r : a.l<b.l; } int main() { int n; n=Read(); for(int i=1; i<=n; ++i) w[i].l=Read(),w[i].r=Read(); sort(w+1,w+1+n,cmp); for(int i=1,k=1; i<=n; ++i,k=!k) //k -> i,!k -> i-1 { dp[k][0]=dp[!k][0]; for(int j=1; j<=i; ++j) { if(w[i].l>=w[j].l && w[i].r<=w[j].r) dp[k][j]=max(dp[k][j],dp[!k][j]+1); dp[k][0]=max(dp[k][0],dp[k][j]); } } cout<<dp[n&1][0]<<'\n'; return 0; }