题目链接:点击打开链接
思路:先扫两遍序列(从左到右和从右到左),得到max[1,i]和min[i,n],若max[1,i] <= a[i] <= min[i,n],那么a[i]符合要求。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int a[100010],ma[100010],mi[100010];
vector<int> v;
int main(){
int n;
scanf("%d",&n);
ma[0] = 0;
for(int i = 1;i <= n;i++){
scanf("%d",&a[i]);
ma[i] = max(a[i],ma[i - 1]);
}
mi[n + 1] = 1000000001;
for(int i = n;i >= 1;i--){
mi[i] = min(a[i],mi[i + 1]);
}
for(int i = 1;i <= n;i++){
if(a[i] >= ma[i] && a[i] <= mi[i]){
v.push_back(a[i]);
}
}
sort(v.begin(),v.end());
printf("%d\n",v.size());
for(int i = 0;i < v.size();i++){
printf("%d%c",v[i],i == v.size() - 1?'\n':' ');
}
if(v.size() == 0) putchar('\n');
return 0;
}