有点类似动态规划
两个数组
left记录前面的最大值
right记录后面的最小值
如果当前值比左边最大的大,比右边最小的小,则有可能是主元。
#include<bits/stdc++.h>
const int maxn=1e5+5;
int arr[maxn],left[maxn],right[maxn];
int main(){
memset(arr,0,sizeof(arr));
memset(left,0,sizeof(left));
memset(right,0,sizeof(right));
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
left[0]=0;
right[n-1]=1e9+5;
for(int i=1;i<n;i++){
if(arr[i]>left[i-1]) left[i]=arr[i];
else left[i]=left[i-1];
if(arr[n-1-i]<right[n-i]) right[n-1-i]=arr[n-1-i];
else right[n-1-i]=right[n-i];
}
int cnt=0;
for(int i=0;i<n;i++){
if(arr[i]>=left[i]&&arr[i]<=right[i]) cnt++;
}
printf("%d\n",cnt);
int flag=0;
for(int i=0;i<n;i++){
if(arr[i]>=left[i]&&arr[i]<=right[i]) {
if(flag==0){
printf("%d",arr[i]);
flag=1;
}else printf(" %d",arr[i]);
}
}
printf("\n");
return 0;
}