Solution:
题目大意:给出一个n个数的序列,n个数都不同,根据快速排序的原理,我们需要选取主元pivot,在pivot左边的元素小于等于pivot,在pivot右边的元素大于等于pivot。我们要求出在这个序列中可以选取多少个主元,并将它们升序打印。
假设输出的序列为a[],我们将它升序排列后得到序列b[],并用两个map m1,m2分别记录每个元素在a和b中的位置,再遍历序列,若m1[a[i]] == m2[a[i]]&&a[i]>=maxl,maxl为在i位置左边的最大元素,这个元素就是主元。
代码如下:
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<stdio.h>
using namespace std;
int a[100005],b[100005];
int n;
map<int,int> m1;
map<int,int> m2;
vector<int> vec;
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
for(int i=0;i<n;i++){
m1[a[i]]=i+1;
}
sort(b,b+n);
for(int i=0;i<n;i++){
m2[b[i]]=i+1;
}
int cnt=0;
int maxl=-1;
for(int i=0;i<n;i++){
if(a[i]>maxl){
maxl=a[i];
}
if(m1[a[i]]==m2[a[i]]&&a[i]>=maxl){
cnt++;
vec.push_back(a[i]);
}
}
sort(vec.begin(),vec.end());
if(cnt==0){
printf("\n");
}else{
printf("%d\n",cnt);
for(int i=0;i<cnt;i++){
printf("%d",vec[i]);
if(i!=cnt-1){
printf(" ");
}
}
}
return 0;
}