题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2319
题意:T组数据,每组给出n组数包含(si,bi),选出最多能形成递增序列的数能选多少个。(可以不按顺序选,只需最后选出来的数能在任意排列后能形成严格递增的序列)。
思路:si按从小到大排,bi在si相等的情况下从大到小排。问题就转变成了求bi的最长递增子序列
#include<algorithm>
#include<string.h>
#include<stdio.h>
using namespace std;
struct node
{
int x,y,id;
int operator < (const node a) const
{
if(x==a.x)
return y>a.y;
return x<a.x;
}
} A[100010];
int t,n;
int lis[100010],d[100010];
int main()
{
scanf("%d",&t);
while(t--)
{
memset(lis,0,sizeof(lis));
memset(d,0,sizeof(d));
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d%d",&A[i].x,&A[i].y);
A[i].id=i;
}
sort(A+1,A+n+1);
lis[1]=A[1].y;
d[1]=1;
int len=1,k=1;
for(int i=2; i<=n; i++)
{
int l=1,r=len,mid,y=A[i].y;
while(l<=r)
{
mid=(l+r)>>1;
if(y>lis[mid]) l=mid+1;
else r=mid-1;
}
len=max(l,len);
lis[l]=A[i].y;
d[i]=l;
}
printf("%d\n",len);
for(int i=n;i>0;--i)
{
if(d[i]==len)
{
printf("%d ",A[i].id);
len--;
}
}
}
return 0;
}