E - Sequence Decomposing (atcoder.jp)
题意:
思路:
让你求一个序列里上升子序列个数
Dilworth定理告诉我们答案就是最长非上升子序列长度
那就是反着用nlogn求最长上升子序列长度
可以当板子用
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mxn=1e5+10;
const int Inf=1e18;
int N;
void solve(){
cin>>N;
vector<int> a(N,0),dp(N,Inf);
for(int i=0;i<N;i++) cin>>a[i];
reverse(a.begin(),a.end());
for(int i=0;i<N;i++){
*upper_bound(dp.begin(),dp.begin()+N,a[i])=a[i];
}
cout<<lower_bound(dp.begin(),dp.begin()+N,Inf)-dp.begin()<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;//cin>>__;
while(__--)solve();return 0;
}