nlogn最长单调递增

来源:互联网 发布:淘宝如何设置客户权限 编辑:程序博客网 时间:2024/05/24 07:02

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


1 0
原创粉丝点击