题目入口
该题是通过树状数组求出最长单调不升子序列和最长单调上升子序列
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int a[maxn], dp[maxn], top;
int f[50050];
int ask(int x){
int ans = 0;
for(int i = x; i > 0; i -= i&-i)
ans = max(ans, f[i]);
return ans;
}
void updata(int x, int val){
for(int i = x; i <= top; i += i&-i)
f[i] = max( val, f[i]);
}
int que(int x){
int ans = 0;
for(int i = x; i <= top; i += i&-i)
ans = max(ans, f[i]);
return ans;
}
void upd(int x, int val){
for(int i = x; i > 0; i -= i&-i)
f[i] = max(val, f[i]);
}
int main(){
int n = 0;
while(cin >> a[++n]){
top = max(top, a[n]);
}
n--;
int ans = 0, len = 0;
for(int i = 1; i <= n; i++){ //求最长单升子序列
int x = que(a[i]) + 1;
len = max(len, x);
upd(a[i], x);
}
memset(f, 0, sizeof(f));
for(int i = 1; i <= n; i++){ //求最长不降子序列
int x = ask(a[i]) + 1;
ans = max(x, ans);
updata(a[i] + 1, x);
}
cout << len << endl;
cout << ans << endl;
return 0;
}