Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
52273 | AK2022071367 | 木板游戏 | C++ | 通过 | 100 | 529 MS | 13920 KB | 1003 | 2022-07-19 11:51:29 |
#include<bits/stdc++.h> using namespace std; const int MAXN=500005; struct node { int l,r,f; bool operator<(const node b) const { return l==b.l?r<b.r:l>b.l; } } p[MAXN],tmp[MAXN]; bool cmp(const node a,const node b) { return a.r<b.r; } int n,Max[MAXN]; void cdq(const int l,const int r) { if(l>=r) return; const int mid=l+r>>1; cdq(l,mid); Max[l-1]=0; for(int i=l; i<=mid; ++i)Max[i]=max(Max[i-1],p[i].f); for(int j=mid+1; j<=r; ++j) { int L=l-1,R=mid,M=0; while(L<R) { M=L+R+1>>1; if(p[M].r<=p[j].r)L=M; else R=M-1; } p[j].f=max(p[j].f,Max[L]+1); } cdq(mid+1,r); for(int i=l,j=mid+1,k=l; k<=r; ++k) if((j>r)||(i<=mid&&p[i].r<=p[j].r))tmp[k]=p[i],++i; else tmp[k]=p[j],++j; for(int i=l; i<=r; ++i)p[i]=tmp[i]; } int main() { scanf("%d",&n); for(int i=1; i<=n; ++i) scanf("%d%d",&p[i].l,&p[i].r),p[i].f=1; sort(p+1,p+n+1),cdq(1,n); int ans=0; for(int i=1; i<=n; ++i)ans=max(ans,p[i].f); printf("%d\n",ans); return 0; }