不太明白为什么第一问len要减1才对 思路就是求最长不升子序列,再求最大上升子序列
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e5 + 5;
int f[N], a[N], b[N];
int num;
int find1(int x, int len){
int l = 1, r = len + 1;
while(l < r){
int mid = (l + r) >> 1;
if(f[mid] <= x){
r = mid;
}else{
l = mid + 1;
}
}
while(f[l] == x){
l++;
}
return l;
}
int find(int x, int len){
int l = 1, r = len+1;
while(l < r){
int mid = (l + r) >> 1;
if(f[mid] >= x){
r = mid;
}else{
l = mid + 1;
}
}
return l;
}
int main(){
int len=0;
while(~scanf("%d", &a[++num]))
memset(f, -1, sizeof f);
f[1] = 1e9;
for(int i=1;i<=num;i++){
int pos = find1(a[i], len);
f[pos] = a[i];
len = max(len, pos);
}
printf("%d\n", len-1);//不明白O.o
len = 0;
memset(f, 0x3f, sizeof f);
f[1] = 0;
for(int i=1;i<=num;i++){
int pos = find(a[i], len);
f[pos] = a[i];
len = max(len, pos);
}
printf("%d", len);
return 0;
}