Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
52291 | HyperSQ | 木板游戏 | C++ | 通过 | 100 | 499 MS | 33444 KB | 962 | 2022-07-19 11:51:49 |
#include <bits/stdc++.h> #define ll long long using namespace std; const int maxn=5e5+5; int val[maxn<<1],cnt; ll C[maxn<<1];ll f[maxn]; int n,m,id[maxn]; int l[maxn],r[maxn]; void update(int x,ll k){ while(x<=m){ C[x]=max(C[x],k);x+=-x&x; } } ll query(int x){ ll ret=0;while(x){ ret=max(ret,C[x]);x-=-x&x; }return ret; } bool cmp(int i,int j){ if(l[i]!=l[j]) return l[i]>l[j]; else return r[i]<r[j]; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d",&l[i],&r[i]); val[++cnt]=l[i],val[++cnt]=r[i]; id[i]=i; } sort(val+1,val+cnt+1); m=unique(val+1,val+cnt+1)-val-1; for(int i=1;i<=n;i++){ l[i]=lower_bound(val+1,val+m+1,l[i])-val; r[i]=lower_bound(val+1,val+m+1,r[i])-val; } sort(id+1,id+n+1,cmp); ll ans=0; for(int j=1;j<=n;j++){ int i=id[j]; int L=l[i],R=r[i]; f[i]=max(f[i],query(R)+1); ans=max(ans,f[i]); update(R,f[i]); } printf("%lld",ans); }