提交时间:2022-07-19 11:51:09

运行 ID: 52252

#include<bits/stdc++.h> using namespace std; const int maxn=5e5+5; int n,dp[maxn],tree[maxn*4],maxr,data[maxn]; struct node { int l; int r; }p[maxn]; bool cmp(node x,node y) { if(x.l == y.l) return x.r>y.r; return x.l<y.l; } void update(int l,int r,int k,int val,int num) { if(l>k || r<k) return ; if(l==r) { tree[num] = max(tree[num],val); return ; } int mid=(l+r)/2; update(l,mid,k,val,num*2); update(mid+1,r,k,val,num*2+1); tree[num] = max(tree[num*2],tree[num*2+1]); } int query(int l,int r,int x,int y,int num) { if(l>=x && r<=y) return tree[num]; if(l>y || r<x) return 0; int mid=(l+r)/2; return max(query(l,mid,x,y,num*2),query(mid+1,r,x,y,num*2+1)); } int main() { // freopen("game.in","r",stdin); // freopen("game.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d%d",&p[i].l,&p[i].r); data[i] = p[i].r; } sort(data+1,data+1+n); for(int i=1;i<=n;++i) { p[i].r = lower_bound(data+1,data+1+n,p[i].r)-data; maxr=max(maxr,p[i].r); } sort(p+1,p+1+n,cmp); dp[1]=1; //build(1,n,1); update(1,maxr,p[1].r,dp[1],1); for(int i=2;i<=n;++i) { dp[i] = query(1,maxr,p[i].r,maxr,1) + 1; update(1,maxr,p[i].r,dp[i],1); } int ans=0; for(int i=1;i<=n;++i) ans=max(ans,dp[i]); printf("%d",ans); }