1101 Quick Sort (25 分)

There is a classical process named partition in the famous quick sort algorithm. In this process we typically choose one element as the pivot. Then the elements less than the pivot are moved to its left and those larger than the pivot to its right. Given N distinct positive integers after a run of partition, could you tell how many elements could be the selected pivot for this partition?

For example, given N=5 and the numbers 1, 3, 2, 4, and 5. We have:

  • 1 could be the pivot since there is no element to its left and all the elements to its right are larger than it;
  • 3 must not be the pivot since although all the elements to its left are smaller, the number 2 to its right is less than it as well;
  • 2 must not be the pivot since although all the elements to its right are larger, the number 3 to its left is larger than it as well;
  • and for the similar reason, 4 and 5 could also be the pivot.

Hence in total there are 3 pivot candidates.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤105). Then the next line contains N distinct positive integers no larger than 109. The numbers in a line are separated by spaces.

Output Specification:

For each test case, output in the first line the number of pivot candidates. Then in the next line print these candidates in increasing order. There must be exactly 1 space between two adjacent numbers, and no extra space at the end of each line.

Sample Input:

5
1 3 2 4 5

Sample Output:

3
1 4 5

本题和快排没有任何关系,做过count pat那题,本题就不难了,思路一样,从前往后遍历,维护最大值,从后往前遍历,维护最小值。但是却卡在格式错误上,原来没有主元时,要输出两个换行符。。。醉了。。。反正pat末尾多了换行不算错。。那么每次都多少输出一个换行吧,这样就不会卡了。。。不过这种输出两个换行的实在是。。

#include<bits/stdc++.h>
using namespace std;
int a[100010],boo[100010]={0};
vector<int> ve;
int main(){
// freopen("in.txt","r",stdin);
int n,Max,Min;
cin>>n;
for(int i=0;i<n;i++) scanf("%d",a+i);
Max=a[0];boo[0]=1;//0左边没有 默认最大
for(int i=1;i<n;i++){
if(a[i]>Max){//比左边都大
boo[i]=1;
Max=a[i];
}
}
Min=a[n-1];
if(boo[n-1]) ve.push_back(a[n-1]);//n-1比左边都大 右边每值 默认最小 直接成立
for(int i=n-2;i>=0;i--){
if(a[i]<Min){
Min=a[i];
if(boo[i]) ve.push_back(a[i]);
}
}
cout<<ve.size()<<endl;
for(int i=ve.size()-1;i>=0;i--){
if(i!=ve.size()-1) cout<<" ";
cout<<ve[i];
}
cout<<endl;
return 0;
}