1 条题解
-
0
自动搬运
来自洛谷,原作者为

Hoks
end搬运于
2025-08-24 22:23:44,当前版本为作者最后更新于2023-12-14 16:00:56,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
前言
思路分析
我们优先考虑两条线段不相交的条件是什么:

如图,可以得到是:
所以题目就被转化成了一个二维偏序问题。
首先考虑用按第一个坐标排序的方法去掉一维。
接着根据 Dilworth 定理可以把题目转化为一个求第二维的最长上升子序列的问题。
代码
#include <bits/stdc++.h> #define int long long using namespace std; struct node{int x,y;}a[100010]; int n,dt,pos; int q[100010]; static char buf[1000000],*paa=buf,*pd=buf; #define getchar() paa==pd&&(pd=(paa=buf)+fread(buf,1,1000000,stdin),paa==pd)?EOF:*paa++ inline int read(void){ int x(0),t(1);char fc(getchar()); while(!isdigit(fc)){if(fc=='-') t=-1;fc=getchar();} while(isdigit(fc)) x=(x<<1)+(x<<3)+(fc^48),fc=getchar(); return x*t; } inline void print(int x) { if(x<0) putchar('-'),x=-x; if(x>9) print(x/10); putchar(x%10+'0'); } bool cmp(node x,node y){return x.x<y.x;} signed main() { n=read(); for(int i=1;i<=n;i++) a[i].x=read(),a[i].y=read(); sort(a+1,a+1+n,cmp);q[++dt]=a[1].y; for(int i=2;i<=n;i++) if(a[i].y<q[dt]) q[++dt]=a[i].y; else { int pos=dt,l=1,r=n; while(l<=r) { int mid=(l+r)>>1; if(a[i].y>=q[mid]) pos=min(pos,mid),r=mid-1; else l=mid+1; } q[pos]=a[i].y; } print(dt); return 0; }
- 1
信息
- ID
- 5817
- 时间
- 500ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者