有点类似动态规划
两个数组
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;
}