Codeforce 340D

来源:互联网 发布:java内存泄露例子 编辑:程序博客网 时间:2024/05/16 11:18
思路:用len[i]记录长度为i时的上升子序列对应的最小的那个数,每次插入一个数就更新len数组,使用二分查找进行修改操作,时间复杂度为O(nlogn),最后i的值就是上升子序列的最大长度。

#include<iostream>#include<cstring>#include<cstdio>using namespace std;int a[100005];int Binary(int temp, int len){    int l = 1, r = len, mid;    while(l <= r)    {        mid = (l + r) >> 1;        if(temp > a[mid])            l = mid + 1;        else            r = mid - 1;    }    return l;   }int main(int argc, char const *argv[]) {    int n, len, k, temp, idx;    /* freopen("in.c", "r", stdin); */    while(~scanf("%d", &n))    {        len = 0;        memset(a, 0, sizeof(a));        for(int i = 1;i <= n;i ++)        {            scanf("%d", &temp);            if(temp > a[len])                a[++len] = temp;            else            {                idx = Binary(temp, len);                a[idx] = temp;            }        }        printf("%d\n", len);    }    return 0;}


0 0
原创粉丝点击