最大上升子序列(从前往后) nlogn 和最大上升序列(从后往前)

来源:互联网 发布:淘宝学生女装店 知乎 编辑:程序博客网 时间:2024/05/18 02:14
#include<bits/stdc++.h>using namespace std;const int N = 1e5+10;int arr[N],len1[N],len2[N];int len,ans[N];int tot;int T[N];int ls[N*20],rs[N*20],sum[N*20];int binary_search(int i){int left,right,mid;left=1,right=len;while(left<=right){mid=(left+right)/2;if(arr[i]<ans[mid]) left=mid+1;else right=mid-1;}return left;}int main(){int t;scanf("%d",&t);while(t--){int n,k;scanf("%d%d",&n,&k);for(int i=1;i<=n;i++)scanf("%d",&arr[i]);ans[1]=arr[1];len1[1]=1;len=1;for(int i=2;i<=n;i++){if(arr[i]>ans[len])ans[++len]=arr[i],len1[i]=len;else{int pos=lower_bound(ans,ans+len,arr[i])-ans;  ans[pos]=arr[i];len1[i]=pos;}}ans[1]=arr[n];len2[n]=1;len=1;for(int i=n-1;i>=1;i--){if(arr[i]<ans[len])ans[++len]=arr[i],len2[i]=len;else{int pos=binary_search(i);ans[pos]=arr[i];len2[i]=pos;}}// for(int i=n;i>=1;i++)// update(T[i-1],T[i],i,val)}}

1 2 1 2 1

从前往后 1 2 1 2 1

从后往前 2 1 2 1 1