题意:
自己读题吧…
分析一下:
本题实则是求最长不升子序列长度和最长上升子序列长度(如不理解,自行思索)
此处附上一个我认为很好的关于单调子序列的博客:
https://www.cnblogs.com/kindleheart/p/8859151.html
PS:upper_bound和lower_bound函数只能用于递增序列,但是,凡是有个但是,稍加操作也可以用于递减。就好比sort()默认按升序排序,但价格cmp函数之后就可以降序排序
关于upper_bound和lower_bound函数,请参见:https://blog.csdn.net/qq1337715208/article/details/81072709
代码君:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int h[maxn], a1[maxn], a2[maxn];
int main(int argc, char const *argv[])
{
// freopen("input.txt", "r", stdin);
int n = 1;
while (~scanf("%d", h + n))
{
++n;
}
n--; //读入完成后n多加了1,我也不知道为啥,我也不敢问啊...
int len1 = 1, len2 = 1;
a1[1] = h[1];
a2[1] = h[1];
for (int i = 2; i <= n; ++i)
{
if (a1[len1] >= h[i])
a1[++len1] = h[i];
else
*upper_bound(a1 + 1, a1 + 1 + len1, h[i], greater<int>()) = h[i];
if (a2[len2] < h[i])
a2[++len2] = h[i];
else
*lower_bound(a2 + 1, a2 + 1 + len2, h[i]) = h[i];
}
printf("%d\n%d\n", len1, len2);
return 0;
}