Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
52273 AK2022071367 木板游戏 C++ 通过 100 529 MS 13920 KB 1003 2022-07-19 11:51:29

Tests(20/20):


#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; }


测评信息: