题目链接:点击打开链接
题目虽然是给的二维坐标,但是根据题目down_left和upper_right是“绝对”的上升关系
所以这自然就变成了我们熟悉的LIS,由于数据量很大,所以我们只能用N(log n)的做法,使用N^2的做法请看另一篇博文
所以以后还是都写nlogn的好了,以免T
使用函数:lower——bound()点击打开链接
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define max 2000010
using namespace std;
struct point{
int x,y,name,order;
bool operator <(const point &t)const
{
if(x!=t.x) return x<t.x;
return name<t.name;
}//
}p[max];
int y_order[max],x_pos[max];
int main()
{
int t,n,i,j,ans;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
if(n==0) break;
for(i=0;i<n;i++)
{
scanf("%d%d",&p[i*2].x,&p[i*2].y);
p[i*2].name=0;
scanf("%d%d",&p[i*2+1].x,&p[i*2+1].y);
p[i*2+1].name=1;
p[i*2].order=p[i*2+1].order=i;
}
n*=2;
sort(p,p+n);
ans=0;
for(i=0;i<n;i++)
{
if(p[i].name==0)
{
x_pos[p[i].order]=lower_bound(y_order+1,y_order+ans+1,p[i].y)-y_order;
}
else
{
int tmp=x_pos[p[i].order];
if(tmp>ans)
y_order[++ans]=p[i].y;
else
y_order[tmp]=min(p[i].y,y_order[tmp]);
}
}
printf("%d\n",ans);
}
return 0;
}