题目描述
Garfield听说OI班有N头神牛,每头神牛有两个属性,算法能力和思维能力,分别以Ai和Bi表示。如果神牛i和神牛j满足Ai ≥ Aj且Bi ≤ Bj,那么两位神牛会互相膜拜。Garfield认为膜拜是不和谐的,所以她想知道,最大的不存在膜拜关系的子集大小。
输入
第一行,一个整数N,表示神牛数量。
接下来N行,每行两个整数Ai和Bi,表示神牛的算法能力和思维能力。
输出
一个整数,表示最大的子集大小。
输入样例
3
1 1
2 3
3 2
输出样例
2
说明
数据规模
对于40%的数据,N ≤ 103,
对于100%的数据,N ≤ 105。
.
.
.
.
.
分析
排序后可把问题转化为求最长下降子序列
.
.
.
.
.
程序:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct edge
{
int a,b;
}w[100010];
int n,a[200000],ans=0,f[200000];
bool cmp(edge x,edge y)
{
if (x.a!=y.a) return x.a>y.a; else return x.b>y.b;
}
void lds()
{
memset(f,127,sizeof(f));
for (int i=1;i<=n;i++)
if (a[i]<f[ans])
{
ans++;
f[ans]=a[i];
} else
{
int l=1,r=ans;
while (l<r)
{
int mid=(l+r)/2;
if (f[mid]<=a[i]) r=mid; else l=mid+1;
}
f[l]=a[i];
}
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d%d",&w[i].a,&w[i].b);
sort(w+1,w+n+1,cmp);
for (int i=1;i<=n;i++)
a[i]=w[i].b;
lds();
printf("%d",ans);
return 0;
}