nlogn最长单调递增

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值