题意:求一个序列里有几个这样的数,左边的都比它小,右边的都比它大。
暴力显然会超时,想到用两个数组分别记录当前位置左边最大的数,右边最小的数,最后再比较一下就行了。
注意:最后要输出一个换行。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
const int inf = 1000000005;
int main() {
int n, a[maxn], ans = 0;
int left[maxn], right[maxn];
scanf("%d", &n);
int temp_max = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
if (i && a[i - 1] > temp_max) temp_max = a[i - 1];
left[i] = temp_max;
}
int temp_min = inf;
for (int i = n - 1; i >= 0; i--) {
if (i != n - 1 && a[i + 1] < temp_min) temp_min = a[i + 1];
right[i] = temp_min;
}
vector<int> v;
for (int i = 0; i < n; i++) {
if (left[i] < a[i] && a[i] < right[i]) {
ans++;
v.push_back(a[i]);
}
}
sort(v.begin(), v.end());
printf("%d\n", ans);
for (int i = 0; i < v.size(); i++) {
printf("%d", v[i]);
if (i < v.size() - 1) printf(" ");
}
printf("\n");
return 0;
}