UVA1471

8-8 防线 UVA1471

解法:紫薯 P-242

先处理 正反来一遍 最长长度 就是 正着的加上倒着来的 可以利用LIS的写法,把正着来的长度每次取最小值,直接用二分找第一个小于NUM的地方,那就是正着的长度,d数组一直维持递增(WHY 每次更新地I长度时,则I-1长度必定也更新了 ,因为i-1 –>i ,类似 LIS的写法)

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
#define inf 0x3f3f3f3f
int a[N];
int b[N];
int c[N];
int d[N];
int main()
{
    int n;
    int t;
    cin>>t;
    while(t--){
        cin>>n;

        for(int i=0;i<n;i++) cin>>a[i];
        b[0]=1;
    ;
        for(int i=1;i<n;i++)
        {
            d[i]=inf;
            b[i]=a[i]>a[i-1]?b[i-1]+1:1;
        }
        c[n-1]=1;
        for(int i=n-2;i>=0;i--)
            c[i]=a[i+1]>a[i]?c[i+1]+1:1;

          int ans=0;
         for(int i=0;i<n;i++)
         {
            int k=lower_bound(d,d+n,a[i])-d;
            ans=max(ans,k+c[i]-1);
            if(d[b[i]]>a[i]) d[b[i]]=a[i];
            //cout<<k<<" " <<c[i]<<endl;

         }
        cout<<ans<<endl;


    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37493070/article/details/80686746