http://blog.acmj1991.com/?p=763
题意:给你一些连线,要求留下不交叉的线,并且是线的数量最大
思路:看了老半天...结果突然发现时最长递增子序列..这题我是用树状数组做的,其实就是插点问线。更新点的值求区间最大值
#include<stdio.h>
#include<string.h>
#define maxN 40010
int key[maxN],pre[maxN];
int low(int x){return x&(-x);}
int max(int x,int y){return x>y?x:y;}
int get_max(int x)
{
int maxx=0;
while(x)
{
maxx=max(maxx,key[x]);
x-=low(x);
}
return maxx;
}
void update(int x)
{
int m=key[x];
do{
x+=low(x);
if(key[x]<m)key[x]=m;
else break;
}while(x<=maxN);
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
int maxx=0;
memset(key,0,sizeof(key));
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&pre[i]);
for(int i=1;i<=n;i++){
key[pre[i]]=get_max(pre[i]-1)+1;
maxx=max(maxx,key[pre[i]]);
update(pre[i]);
}
printf("%d\n",maxx);
}
}