• 最长不下降子序列nlogn


    b[i]表示长度为i的最长不下降子序列的最小末尾元素的值
    显然它是单调递增的,满足二分性质,然后就可以愉快地二分啦.

    这个做法是错误的!!!!!!!(划掉

    这个方法是正确的,替换的时候虽然位置顺序换了,最终输出来的答案不对,但是是存在正确答案替换回去的,想出这个方法的人也是真的nb!

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<algorithm>
    #include<cmath>
    #include<ctime>
    #include<set>
    #include<map>
    #include<stack>
    #include<cstring>
    #define inf 2147483647
    #define ls rt<<1
    #define rs rt<<1|1
    #define lson ls,nl,mid,l,r
    #define rson rs,mid+1,nr,l,r
    #define N 100010
    #define For(i,a,b) for(int i=a;i<=b;i++)
    #define p(a) putchar(a)
    #define g() getchar()
    
    using namespace std;
    int a[N],b[N],n,len;
    void in(int &x){
        int y=1;
        char c=g();x=0;
        while(c<'0'||c>'9'){
            if(c=='-')y=-1;
            c=g();
        }
        while(c<='9'&&c>='0'){
            x=(x<<1)+(x<<3)+c-'0';c=g();
        }
        x*=y;
    }
    void o(int x){
        if(x<0){
            p('-');
            x=-x;
        }
        if(x>9)o(x/10);
        p(x%10+'0');
    }
    int main(){
        in(n);
        For(i,1,n)in(a[i]);
        len=1;
        b[1]=a[1];
        For(i,2,n){
            if(a[i]>=b[len])b[++len]=a[i];
            else{
                int x=upper_bound(b+1, b+len+1, a[i])-b;
                 b[x]=a[i];
            }
    //            b[upper_bound(b+1, b+len+1, a[i])-b-1]=a[i];
        }
        o(len);
        return 0;
    }

  • 相关阅读:
    springMvc
    计算机网络
    Mybatis 总结
    Spring 面试总结
    Java IO 流
    自定义类加载器
    缓存一致性协议
    dfs、bfs序
    7.26
    Trick
  • 原文地址:https://www.cnblogs.com/war1111/p/9974240.html
Copyright © 2020-2023  润新知