单调递增子序列+二分优化

来源:互联网 发布:三体 阶梯飞行器 知乎 编辑:程序博客网 时间:2024/05/19 23:16

点击打开链接

 # include<stdio.h># include<string.h>int dp[100001],a[100001];int find(int begin,int end,int num){    int x,y,m;    x=begin;    y=end;    if(dp[x]>=num)    return x;    while(x<=y)    {        m=(x+y)/2; //printf("%d ",m);        if(dp[m]>=num)        {            if(dp[m-1]<num)            return m;            else            y=m-1;        }        else        {            if(dp[x]>=num)            return x;            else             x=m+1;        }    }}int main(){int n;//freopen("2.txt","r",stdin);while(~scanf("%d",&n)){if(n==0)continue;int i,p=1,m;scanf("%d",&a[0]);dp[1]=a[0];for(i=1;i<n;i++){scanf("%d",&a[i]);if(a[i]>dp[p])dp[++p]=a[i];else{    m=find(1,p,a[i]);//printf("%d ",m);dp[m]=a[i];}}printf("%d\n",p);}return 0;}