提交时间:2022-07-19 12:11:41
运行 ID: 52437
#include<bits/stdc++.h> #define ll long long #define lb(x) (x&-x) using namespace std; const int N=5e5+10; inline ll read(){ ll x=0,f=1,c=getchar(); while(c<'0'||c>'9')f=(c=='-'?-1:1),c=getchar(); while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } int n,id[N],rnk[N],dp[N]; struct Node{ int l,r; }t[N]; inline bool cmp(Node a,Node b){ return a.l==b.l?a.r>b.r:a.l<b.l; } inline bool cmp2(int a,int b){ return t[a].r>t[b].r; } int T[N]; inline void add(int x,int k){ for(;x<=n;x+=lb(x))T[x]=max(T[x],k); } inline int query(int x,int A=0){ for(;x;x-=lb(x))A=max(A,T[x]); return A; } int main(){ n=read(); for(int i=1;i<=n;i++)t[i].l=read(),t[i].r=read(),id[i]=i; sort(t+1,t+n+1,cmp); sort(id+1,id+n+1,cmp2); for(int i=1;i<=n;i++)rnk[id[i]]=i; for(int i=1;i<=n;i++){ dp[i]=query(rnk[i]-1)+1; add(rnk[i],dp[i]); } // for(int i=1;i<=n;i++)printf("%d ",rnk[i]); // puts(""); int ans=0; for(int i=1;i<=n;i++)ans=max(ans,dp[i]); printf("%d",ans); return 0; }