AcWing 2978. 最长上升子序列
原题链接
困难
作者:
我已经不想再做刺客了
,
2022-03-27 21:59:25
,
所有人可见
,
阅读 462
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
vector<int>a;
int n,tr[N],dp[N];
void add(int x,int c){
for(int i=x;i<=n;i+=i&-i)tr[i]=max(tr[i],c);
}
int sum(int x){
int ans=0;
for(int i=x;i;i-=i&-i)ans=max(ans,tr[i]);
return ans;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
int x;
cin>>x;
a.insert(x+a.begin(),i);
}
int ans=0;
for(int i=0;i<n;i++){
int t=a[i];
dp[t]=sum(t)+1;
add(t,dp[t]);
}
for(int i=1;i<=n;i++){
dp[i]=max(dp[i],dp[i-1]);
cout<<dp[i]<<'\n';
}
}