emmm...还是看的题解,还不是很懂,但是代码还挺简单的,先记下来
#include<iostream> #include<string> #include<stack> #include<stdio.h> #include<queue> #include<string.h> #include<map> #include<unordered_map> #include<vector> #include<iomanip> #include<cmath> #include<algorithm> using namespace std; typedef long long ll; const int maxn = 1e5 + 100; inline int read() { int f = 1, num = 0; char ch = getchar(); while (0 == isdigit(ch)) { if (ch == ‘-‘)f = -1; ch = getchar(); } while (0 != isdigit(ch)) num = (num << 1) + (num << 3) + ch - ‘0‘, ch = getchar(); return num * f; } int v[maxn]; int n; int len1, len2; int d1[maxn]; int d2[maxn]; int main() { //freopen("test.txt", "r", stdin); while (~scanf("%d", &v[++n])) { } n--; d1[++len1] = v[1], d2[++len2] = v[1]; for (int i = 2; i <= n; i++) { if (d1[len1] >= v[i]) { d1[++len1] = v[i]; } else { int pos = upper_bound(d1 + 1, d1 + len1 + 1, v[i], greater<int>())-d1; d1[pos] = v[i]; } if (d2[len2] < v[i]) { d2[++len2] = v[i]; } else { int pos = lower_bound(d2 + 1, d2 + len2 + 1, v[i]) - d2; d2[pos] = v[i]; } } cout << len1 << endl; cout << len2 << endl; return 0; }
原文:https://www.cnblogs.com/MYMYACMer/p/14351046.html