Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
52398 jr_zlw 木板游戏 C++ 通过 100 310 MS 13332 KB 1440 2022-07-19 12:07:07

Tests(20/20):


//按左端点排序选取右端点的最长不升子序列 #include<cstdio> #include<algorithm> #include<cstring> #define rep(a,b,c) for(int c(a);c<=(b);++c) inline int read() { int res=0;char ch=getchar();while(ch<'0'||ch>'9')ch=getchar(); while(ch<='9'&&ch>='0')res=res*10+(ch^48),ch=getchar();return res; } template<typename T> inline T Max(const T&x,const T&y){return x<y?y:x;} const int N=5e5+10;int n,m,P[N],p,mx[N<<2]; struct NN{int l,r;inline bool operator<(const NN &x){return l==x.l?r>x.r:l<x.l;}}t[N]; inline int bnd(int k){int l(1),r(p),m;while(l<=r)P[m=(l+r)>>1]<=k?l=m+1:r=m-1;return l-1;} inline void mdy(int pos,int w,int l=1,int r=p,int cur=1) { if(l==r){mx[cur]=Max(w,mx[cur]);return;}int mid=(l+r)>>1; pos<=mid?mdy(pos,w,l,mid,cur<<1):mdy(pos,w,mid+1,r,cur<<1|1); mx[cur]=Max(mx[cur<<1],mx[cur<<1|1]); } inline int qry(int ql,int qr,int l=1,int r=p,int cur=1) { if(ql==l&&r==qr)return mx[cur];int mid=(l+r)>>1; if(qr<=mid)return qry(ql,qr,l,mid,cur<<1);if(ql>mid)return qry(ql,qr,mid+1,r,cur<<1|1); return Max(qry(ql,mid,l,mid,cur<<1),qry(mid+1,qr,mid+1,r,cur<<1|1)); } int main() { // freopen("game.in","r",stdin); // freopen("game.out","w",stdout); n=read();rep(1,n,i)t[i].l=read(),P[i]=t[i].r=read();std::sort(t+1,t+n+1); std::sort(P+1,P+n+1);p=std::unique(P+1,P+n+1)-P-1;rep(1,n,i)t[i].r=bnd(t[i].r); rep(1,n,i)mdy(t[i].r,qry(t[i].r,p)+1);printf("%d\n",mx[1]);return 0; }


测评信息: