#include<bits/stdc++.h>
using namespace std;
const int N=4e4+4;
int bit[N],a[N],b[N],n;//bit[i]存以i结尾的最长上升长度,a,b分别为第1,2维偏序,二维偏序
inline int lowbit(int x){return x&-x;}
inline int add(int i,int x){while(i<=n)bit[i]=max(bit[i],x),i+=lowbit(i);}
inline int sum(int i){
int ans=0;
while(i)ans=max(ans,bit[i]),i-=lowbit(i);
return ans;
}
int main(){
int t;scanf("%d",&t);
while(t--){
scanf("%d",&n);
memset(bit,0,sizeof(bit));
for(int i=1;i<=n;++i)scanf("%d",&a[i]),b[a[i]]=i;
sort(a+1,a+n+1);
int ans=0;
for(int i=1;i<=n;++i){
int tmp=sum(b[a[i]])+1;
ans=max(tmp,ans);
add(b[a[i]],tmp);
}
printf("%d\n",ans);
}
return 0;
}
HDU-1950 最长上升 二维偏序
最新推荐文章于 2023-12-02 20:30:50 发布