最长**子序列$O(nlog_n)$解法
实现原理
最长上升子序列
int _1() {
int up_sum=0;
for(int i=1; i<=n; i++) {
if(a[i] > F_up[up_sum]) {
F_up[++up_sum]=a[i];
} else {
F_up[upper_bound(F_up,n,a[i])]=a[i];
}
}
return up_sum;
}
最长不下降子序列
int _2() {
int up_sum=0;
for(int i=1; i<=n; i++) {
if(a[i] >= F_up[up_sum]) {
F_up[++up_sum]=a[i];
} else {
F_up[upper_bound(F_up,n,a[i])]=a[i];
}
}
return up_sum;
}
最长下降子序列
int _3() {
int down_sum=0;
F_down[++down_sum]=a[1];
for(int i=2; i<=n; i++) {
if(a[i] < F_down[down_sum]) {
F_down[++down_sum]=a[i];
} else {
F_down[lower_bound(F_down,down_sum,a[i])]=a[i];
}
}
return down_sum;
}
最长不上升子序列
int _4() {
int down_sum=0;
F_down[++down_sum]=a[1];
for(int i=2; i<=n; i++) {
if(a[i] <= F_down[down_sum]) {
F_down[++down_sum]=a[i];
} else {
F_down[lower_bound(F_down,down_sum,a[i])]=a[i];
}
}
return down_sum;
}