LIS O(nlgn)最简写法

来源:互联网 发布:金税盘开票软件更新 编辑:程序博客网 时间:2024/06/03 22:51

挑战上一个LIS的写法真的好短,,,

利用了STL的fill,lower_bound


1.这里注意fill,memset的区别

memset是按字节填充的,初始化的时候只能初始化为0,-1,不能为1或其他

例如当memset int 初始化为1时,则为

(1<<24)+(1<<16)+(1<<8)+1=16843009

fill是把某一区域赋值


2.lower_bound:找出第一个a[i]<=k的值

   upper_bound:找出第一个a[i]>k的值

求长度为n的有序数组a中k的个数:upper_bound(a,a+n,k)-lower_bound(a,a+n,k)


#include<stdio.h>#include<string.h>#include <iostream>#include <algorithm>using namespace std;const int INF=99999999;int dp[100],a[100];int n;void solve(){    fill(dp,dp+n,INF);    for(int i=0;i<n;i++)    *lower_bound(dp,dp+n,a[i])=a[i];    cout<<lower_bound(dp,dp+n,INF)-dp;}int main(){    cin>>n;    for(int i=0;i<n;i++)    cin>>a[i];    solve();    return 0;}


0 0