标题诈骗!!!
一看到题目的快速排序,我啪的一下,很快啊,题目都没看就把快速排序的Partion函数写完了,写完之后发现,我大意了,这题似乎跟快速排序没点鬼关系……于是重写了一个双指针……
其实对于每个数它如果比它左边的数都大&&比其右边的数都小的话,那它就是是一个主元。(其实就是比它左边最大的数大,比它右边最小的数小就可以了)
# include <iostream>
# include <vector>
# include <climits>
# include <algorithm>
using namespace std;
int N;
vector<long long> A(100010);
int main()
{
cin >> N;
for(int i=0;i<N;++i)
cin >> A[i];
vector<long long> ans;
vector<bool> leftMAX(N, 0); // 从左开始,每个数是不是比其左边的数都大(比左边最大的大就可以了)
vector<bool> rightMIN(N, 0); // 从右开始,每个数是不是都比其右边的数都小(比右边最小的小就可以了)
long long maxx = INT_MIN;
long long minn = INT_MAX;
for(int i=0;i<N;++i){
if(A[i] > maxx){
leftMAX[i] = 1;
maxx = A[i];
}
if(A[N-1 - i] < minn){
rightMIN[N-1 - i] = 1;
minn = A[N-1 - i];
}
}
for(int i=0;i<N;++i)
if(leftMAX[i] == 1 && rightMIN[i] == 1)
ans.push_back(A[i]);
sort(ans.begin(), ans.end());
cout << ans.size() << endl;
for(int i=0;i<ans.size();++i){
cout << ans[i];
if(i != ans.size() - 1)
cout << " ";
}cout << endl;
return 0;
}