提交时间:2022-07-19 11:51:50
运行 ID: 52294
#include<cstdio> #include<algorithm> #include<queue> using namespace std; struct edge{ int nxt,go; }e[4000010]; int head[500010],cnt; void add(int u,int v){e[++cnt]=(edge){head[u],v},head[u]=cnt;} int n; int l[500010],r[500010],f[500010]; int deg[500010]; int main() { // freopen("game.in","r",stdin); // freopen("game.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d %d",l+i,r+i); for(int j=1;j<i;j++) { if(l[j]<=l[i]&&r[j]>=r[i]) add(i,j),++deg[j]; else if(l[j]>=l[i]&&r[j]<=r[i]) add(j,i),++deg[i]; } } queue<int> q; for(int i=1;i<=n;i++) if(!deg[i]) q.push(i),f[i]=1; while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u];i;i=e[i].nxt) { int v=e[i].go; --deg[v]; f[v]=max(f[v],f[u]+1); if(!deg[v]) q.push(v); } } for(int i=1;i<=n;i++) f[0]=max(f[0],f[i]); printf("%d\n",f[0]); // fclose(stdin); // fclose(stdout); return 0; }