• 最长不下降子序列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;
    }

  • 相关阅读:
    Gdb等几则笔记
    让GtkTextView支持undo/redo操作
    让基于DirectFB的Mozilla支持透明图
    在minimo中用方向键切换焦点
    Marvelllinux研究—dma.c源代码分析
    “垃圾”文章为何能上首页
    用xoops建立自己的开源网站
    R语言中sample函数
    R语言中text函数
    R语言绘图去除外围框线、坐标轴标线
  • 原文地址:https://www.cnblogs.com/war1111/p/9974240.html
Copyright © 2020-2023  润新知