欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Defense Lines(dp+二分)

程序员文章站 2022-03-12 17:59:44
...

思路(好久不写字,丑点但是很详细)

Defense Lines(dp+二分)Defense Lines(dp+二分)

AC代码(700ms)

#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=2e5+5;
const int INF=0x3f3f3f;
int a[N];
int L[N],R[N];
int q[N];
int n;
int main(){
    int  T;
    cin >> T;
    while(T--){
        cin >> n;
        memset(q,INF,sizeof q);
        for(int i=1;i<=n;i++)cin >> a[i];
        R[n]=1;L[1]=1;
        for(int i=2;i<=n;i++){
            L[i]=1;
            if(a[i]>a[i-1])L[i]=L[i-1]+1;
        }
        for(int i=n-1;i>=1;i--){
            R[i]=1;
            if(a[i]<a[i+1])R[i]=R[i+1]+1;
        }
        int len=0;//len表示q的最大索引
        int ans=0;
        for(int i=1;i<=n;i++){
            int l=0;int r=len;
            while(l<r){
                int mid=(l+r+1)>>1;
                if(a[i]>q[mid])l=mid;
                else r=mid-1;
            }
            len=max(len,L[i]);
            q[L[i]]=min(q[L[i]],a[i]);
            ans=max(ans,R[i]+r);
        }
        cout << ans << "\n";
    }
}
相关标签: 动态规划