http://acm.hdu.edu.cn/showproblem.php?pid=1950
问题概述:输入n个整数,求出最长严格单调递增序列,n<=100000
输入样例: 对应输出:
1 5
7
1 3 2 4 6 7 2
len数组:len[k]表示长度为k的单调递增序列中最大的那个数为len[k]
ans数组:ans[k]表示以第k个元素结尾的最长递增序列长度
例如: 1 3 2 4 6 7 2
len: 1 2 4 6 7 X X
ans: 1 2 2 3 4 5 2
#include<stdio.h>
#include<string.h>
int a[100005], best[100005], ans[100005], len;
int Bsech(int x)
{
int l, r, m;
l = 0, r = len;
while(l<r)
{
m = l+(r-l)/2;
if(best[m]>=x)
r = m;
else
l = m+1;
}
return l;
}
int main(void)
{
int T, n, i, j, pos;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(i=1;i<=n;i++)
scanf("%d", &a[i]);
len = 1;
best[1] = a[1], ans[1] = 1;
for(i=2;i<=n;i++)
{
if(a[i]>best[len])
best[++len] = a[i], ans[i] = len;
else
{
pos = Bsech(a[i]);
//ans[i] = pos;
best[pos] = a[i];
}
}
printf("%d\n", len);
/*printf("%d", ans[1]);
for(i=2;i<=n;i++)
printf(" %d", ans[i]);
printf("\n");*/
}
return 0;
}