51nod 1134 最长递增子序列 nlogn lis

来源:互联网 发布:怎样安装t3软件 编辑:程序博客网 时间:2024/06/06 02:49

记录下模板

 

#include <map>#include <queue>#include <cmath>#include <cstdio>#include <cstring>#include <stdlib.h>#include <iostream>#include <algorithm>#define maxn 70000using namespace std;int b[maxn],dp[maxn];int find_it(int x,int len){    int l,r,m;    l=1,r=len;    while(l<r){        m=(l+r)>>1;        if(dp[m]>=b[x])r=m;        else l=m+1;    }    return l;}int main(){    int t,n,la,lb,cnt=1,tmp;    while(~scanf("%d",&n)){        for(int i=1;i<=n;++i)scanf("%d",&b[i]);        tmp=1;        dp[1]=b[1];        for(int i=2;i<=n;++i)            if(b[i]>dp[tmp])                dp[++tmp]=b[i];            else{                int pos=find_it(i,tmp);                dp[pos]=b[i];            }        printf("%d\n",tmp);    }    return 0;}/*13 6 71 7 5 4 8 3 91 4 3 5 6 2 8 9*/

更简洁的///严格递增

#include <map>#include <queue>#include <cmath>#include <cstdio>#include <cstring>#include <stdlib.h>#include <iostream>#include <algorithm>#define maxn 70000using namespace std;int b[maxn],dp[maxn];int main(){    int t,n,la,lb,cnt=1,tmp;    while(~scanf("%d",&n)){        for(int i=1;i<=n;++i)scanf("%d",&b[i]);        tmp=0;        for(int i = 1; i <= n; i ++){            int pos=lower_bound(dp,dp+tmp,b[i])-dp;            dp[pos]=b[i];            if(pos==tmp)                tmp++;        }        printf("%d\n",tmp);    }    return 0;}/*13 6 71 7 5 4 8 3 91 4 3 5 6 2 8 9*/

0 0
原创粉丝点击