Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
52320 | lzqy_ | 木板游戏 | C++ | 通过 | 100 | 647 MS | 145724 KB | 1143 | 2022-07-19 11:52:48 |
#include<bits/stdc++.h> #define il inline using namespace std; const int maxn=500010; const int N=maxn*32; il int read(){ int x=0; char c=getchar(); for(;!(c>='0'&&c<='9');c=getchar()); for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+c-'0'; return x; } struct Stick{ int l,r; }a[maxn]; int data[N],ls[N],rs[N]; int f[maxn],n,ans,cnt,rt; bool cmp(Stick a,Stick b){return (a.l^b.l)?a.l<b.l:a.r>b.r;} int Query(int i,int l,int r,int L,int R){ if(!i) return 0; if(l>=L&&r<=R) return data[i]; if(l>R||r<L) return 0; int mid=l+r>>1; return max(Query(ls[i],l,mid,L,R),Query(rs[i],mid+1,r,L,R)); } void Add(int &i,int l,int r,int x,int k){ if(!i) i=++cnt; if(l==x&&r==x){ data[i]=max(data[i],k); return ; } int mid=l+r>>1; if(mid>=x) Add(ls[i],l,mid,x,k); else Add(rs[i],mid+1,r,x,k); data[i]=max(data[ls[i]],data[rs[i]]); } int main(){ n=read();int V=0; for(int i=1;i<=n;i++) a[i].l=read(),V=max(a[i].r=read(),V); sort(a+1,a+1+n,cmp); for(int i=1;i<=n;i++){ f[i]=Query(1,1,V,a[i].r,V)+1; Add(rt,1,V,a[i].r,f[i]),ans=max(ans,f[i]); } printf("%d\n",ans); return 0; }