开辟两个数组分别记录当前位置左边的最大值与右边的最小值
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
#define INF (~(1<<31))
int main(){
int n;
cin >> n;
vector<int> arr(n), maxLeft(n), minRight(n);
int mmax = -INF-1, mmin = INF;
for(int i = 0; i < n; ++i){
scanf("%d", &arr[i]);
if(arr[i] > mmax){
mmax = arr[i];
}
if(i+1 < n){
maxLeft[i+1] = mmax;
}
}
maxLeft[0] = -INF;
for(int i = n-1; i >= 0; --i){
if(arr[i] < mmin){
mmin = arr[i];
}
if(i > 0){
minRight[i-1] = mmin;
}
}
minRight[n-1] = INF;
vector<int> results;
for(int i = 0; i < n; ++i){
if(arr[i] > maxLeft[i] && arr[i] < minRight[i]){
results.push_back(arr[i]);
}
}
printf("%d\n", (int)results.size());
for(size_t i = 0; i < results.size(); ++i){
if(i) printf(" ");
printf("%d", results[i]);
}
if(results.empty()) printf("\n");
return 0;
}