cdq解決LIS問題

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int inf = 0x3f3f3f3f;
const int N = 100005;
int dp[N],a[N],b[N];
int t[N*4];
int n;
void upd(int rt,int l,int r,int pos,int val)
{
    if(l==r)
    {
        t[rt]=val;
        return ;
    }
    int m=(l+r)>>1;
    if(pos<=m) upd(rt<<1,l,m,pos,val);
    else upd(rt<<1|1,m+1,r,pos,val);
    t[rt]=max(t[rt<<1],t[rt<<1|1]);
}

int ask(int rt,int l,int r,int ql,int qr)
{
    if(l>=ql && r<=qr)
    {
        return t[rt];
    }
    int m=(l+r)>>1;
    int q1=0;
    int q2=0;
    if(ql<=m) q1=ask(rt<<1,l,m,ql,qr);
    if(qr>m) q2=ask(rt<<1|1,m+1,r,ql,qr);
    return max(q1,q2);
}

void cdq(int l,int r)
{
    if(l>=r) return ;
    int m=(l+r)>>1;
    cdq(l,m);
    for(int i=l;i<=m;i++)upd(1,1,n,a[i],dp[i]);

    for(int j=m+1;j<=r;j++)
    {
        dp[j]=max(dp[j],ask(1,1,n,1,a[j])+1);
    }
    for(int i=l;i<=m;i++)upd(1,1,n,a[i],0);
    cdq(m+1,r);
}

int main()
{
    while(cin>>n)
    {
        for(int i=1;i<=n;i++)scanf("%d",&a[i]),dp[i]=1;
        cdq(1,n);
        cout<<*max_element(dp+1,dp+1+n)<<endl;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章