nlogn LIS模板

nlogn 模板 最长上升

#include<bits/stdc++.h>
using namespace std;
const int N=100050;
int n,x,y,a[N],num[N],d[N],len;
/*
int binary_search(int i){
    int left,right,mid;
    left=0,right=len;
    while(left<right){
        mid = left+(right-left)/2;
        if(ans[mid]>=arr[i]) right=mid;
        else left=mid+1;
    }
    return left;
}
*/ 
int main(){
    //LCS转换成LIS 
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>x,num[x]=i;
    for(int i=1;i<=n;i++)
        cin>>y,a[i]=num[y];
        
    //nlogn LIS    
    d[1]=a[1],len=1;    
    for(int i=2;i<=n;i++){
        if(a[i]>d[len])
           d[++len]=a[i];
        else{
           //int pos=binary_search(i);
           int pos=lower_bound(d,d+len,a[i])-d;
           d[pos]=a[i];}    
    }
    printf("%d",len);return 0;}

UVa10635,蓝书p66例题27:另一种写法

#include<bits/stdc++.h>

using namespace std;

const int N=100000;
const int inf=0x3f3f3f3f;

int s[N],g[N],d[N],num[N];

int main(){
    int t;scanf("%d",&t);
    for(int kase=1;kase<=t;kase++){
        int N,p,q,x;
        scanf("%d%d%d",&N,&p,&q);
        memset(num,0,sizeof num);
        for(int i=1;i<=p+1;i++){
            scanf("%d",&x);
            num[x]=i;}
        int n=0;
        for(int i=0;i<q+1;i++){
            scanf("%d",&x);
            if(num[x]) s[n++]=num[x];}
            
        for(int i=1;i<=n;i++) g[i]=inf;
        int ans=0;
        for(int i=0;i<n;i++){
            int k=lower_bound(g+1,g+1+n,s[i])-g;
            d[i]=k;
            g[k]=s[i];
            ans=max(ans,d[i]);
        }printf("Case %d: %d\n",kase,ans);
    }return 0;
}

 ATTENTION:最长不下降,需要a[i]>=d[len]以及      UPPER_bound !!!!

posted @ 2018-09-01 10:00  ASDIC减除  阅读(292)  评论(0编辑  收藏  举报