[二分优化] hdu 1950 Bridging signals

来源:互联网 发布:淘宝店铺图片 编辑:程序博客网 时间:2024/05/16 10:07

题意:

求最长上升子序列长度。

思路:

由于n比较大,普通的n^2的方法一定会超时

这里引进nlogn的算法。

其实就是因为我们最后只要长度 不要原串

我们可以搜索一遍序列

然后在已经构建的数组内二分查找最小的比v[i]大的数

如果没有则放入长度加一

如果有则更新换小

最后求得的就是最长的长度了

代码:

#include"cstdlib"#include"cstdio"#include"cstring"#include"cmath"#include"queue"#include"algorithm"#include"iostream"using namespace std;//2014年9月26日10:42:30int ans[123456],v[123456];int main(){    int t;    cin>>t;    while(t--)    {        int n;        scanf("%d",&n);        int i;        memset(ans,0,sizeof(ans));        for(i=0;i<n;i++) scanf("%d",&v[i]);        int cnt=0;        for(i=0;i<n;i++)        {            int mid,l=0,r=cnt;            int ok=-1;            while(l<=r)            {                mid=(l+r)/2;                if(ans[mid]>=v[i])                {                    ok=mid;                    r=mid-1;                }                else l=mid+1;            }            if(ok==-1) ans[cnt++]=v[i];            else ans[ok]=v[i];        }        printf("%d\n",cnt);    }    return 0;}//2014年9月26日11:02:53




0 0
原创粉丝点击