记录每个位置之前和之后的最大最小值。
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> v;
int main(){
int n;
scanf("%d",&n);
for (int i=0; i<n; i++) {
int a;
scanf("%d",&a);
v.push_back(a);
}
vector<int> v1;
v1.push_back(0);
for (int i=1; i<n; i++) {
v1.push_back(max(v1[i-1],v[i-1]));
}
int arr[100010];
arr[n-1] = 0x7fffffff;
for (int i=n-2; i>=0; i--) {
arr[i] = min(arr[i+1],v[i+1]);
}
vector<int> ans;
for (int i=0; i<n; i++) {
if (v[i] >=v1[i] && v[i] <= arr[i]) {
ans.push_back(v[i]);
}
}
printf("%d\n",ans.size());
sort(ans.begin(), ans.end());
for (int i=0; i<ans.size(); i++) {
printf("%d",ans[i]);
if (i != ans.size()-1) {
printf(" ");
}
}
printf("\n");
}