1045クイックソート(25ポイント)
プロセスの古典的な分割の有名な高速ソートアルゴリズム:我々は、通常、いくつかの方法を使用して交換を介して、主成分としての要素を取得し、より少ない元素比よりも主元の左側に入れPCAその右に大きな要素。所定の分割後の互いに異なるnは正の整数の配列は、PCA Iは、予め選択さに分割することができるどのように多くの要素を求めることができますか?
例えば、与えられました
、配置が1,3,2,4,5です。その後:
;、それはPCAかもしれないので、それは、大きいよりも右側の素子を1ない要素を残していない
ことが主成分であることができないので、2時間より左側が小さい場合よりも素子3が、その右が;
ただしそれは大規模な素子2,3の右側にあるが、それは主要な要素ではないので、それは、その左側より大きいものよりも、
同様の理由は、図4及び図5は、主要素である可能性が高いです。
従って、3つの要素は、主成分分析であってもよいです。
入力フォーマット:
入力線1は2行目のN整数正(≤105)で与えられるスペースN個の異なる正の整数によって分離されている、多くて109以上の数。
出力フォーマット:
最初の行では、主要な要素の可能な出力素子の数であり、システム内の2行目のこれらの要素の昇順で出力が、ラインが余分なスペースを含めを持っていない可能性があり、スペースで区切られました。
サンプル入力:
5
1 5 4 3 2。
出力例:
3
1. 4. 5。
ソリューションの概要:ソート配列、配列はソート位置に対応する場合には一定のままであり、先行する要素の満たす全ての要素は、対応する位置が、所望されるよりも大きい場合、出力することができ
#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 100010;
int a[maxn],b[maxn];
int main(){
int N = 0;
vector<int> v;
cin >> N;
for (int i = 0; i < N; i++){
cin >> a[i];
b[i] = a[i];
}
sort(a, a + N);
int max = 0;
for (int i = 0; i < N; i++){
if (a[i] == b[i]){
if (a[i]>max){
v.push_back(a[i]);
}
}
if (max<b[i]){
max = b[i];
}
}
printf("%d\n", v.size());
for (int i = 0; i < v.size(); i++){
if (i != 0)printf(" ");
printf("%d", v[i]);
}
printf("\n");
return 0;
}