Defense Lines(dp+二分)
程序员文章站
2022-03-12 17:59:44
...
思路(好久不写字,丑点但是很详细)
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";
}
}
上一篇: pytorch学习教程笔记(一)
下一篇: 线性表之链表