有名なクイックソートアルゴリズムでパーティションという名前の古典的なプロセスがあります。このプロセスでは、我々は通常、ピボットとして一つの要素を選択してください。次いで、ピボットより少ない要素は、その左と右のピボットよりも大きいものに移動されます。与えられた パーティションの実行後にN個の異なる正の整数、あなたはこのパーティションのために選択されたピボット可能性がどのように多くの要素を言うことができますか?
例えば、所与の N = 5と番号1、3、2、4、および5我々は持っています。
- 1の左への要素が存在しないので、旋回することと、その右側にあるすべての要素は、それよりも大きい可能性があり、
- その左側のすべての要素が小さくなるものの、その右側に番号2を同様にそれよりも小さいので、3ピボットであってはなりません。
- その右側にあるすべての要素が大きくなるものの、その左の数字3は同様にそれよりも大きいので2ピボットであってはなりません。
- そして、同様の理由で、図4および図5はまた、ピボットであってもよいです。
従って、合計で3つのピボット候補があります。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、正の整数与える Nを(≤)。その後、次の行が含まれている N個の別個の正の整数ではないより大きい 行に1の番号がスペースで区切られています。
出力仕様:
各テストケースのために、最初の行に出力ピボット候補の数。そして、次の行に昇順でこれらの候補を印刷します。丁度1つの隣接する二つの数字の間のスペース、および各行の末尾に余分なスペースがなければなりません。
サンプル入力:
5
1 3 2 4 5
サンプル出力:
3 1 4 5
1つの#include <iostreamの> 2の#include <ベクトル> 3。の#include <キュー> 4。 使用した 名前空間STD; 5 INT N、NUMS [ 100100 ]、ミネソタ州[ 100100 ]、MAXN [ 100100 ]、RES = 0、resNum [ 100100 ] ; // 右側の最小値、(自身を含む)の左最大 6 INT メイン() 7。 { 8。 CIN >> N; 9が ため(int型 I = 0 ; iがNを<; ++ I) 10 CIN >> NUMSを[I ]; 11 用(INT I = 1 ; Iは、N <; Iを++)// それ自身を含まない、左から各位置の最大値を見つける 12は MAXN [I] = MAX(MAXN [I - 。1 ]、NUMS [I - 。1 ] ); 13は、 ミネソタ州[N - 1 ] = 9999999999 ; 14 用の(int型 I = N- 2 ; I> = 0 ;株式会社(www.i-levelmedia.com))// 右にそれぞれ位置の最小値を見つけ、それ自身は含まれない 15 ミネソタ州[I]を分=(ミネソタ州は、[I +は1。 ]、NUMSは[Iは+ 1 ]); 16 用(INT I = 0 ; iがn <; ++ I)を 17 であれば(NUMS [I]> MAXN [I] && NUMS [I] < ミネソタ[i])と 18 resNum [RES ++] =のNUMS [I]。 19 COUT << RES << ENDL。 20 のために(int型 I = 0 ; iがRESを<; ++ i)が 21 COUT << resNum [i]が<<(I == RES - 1?"" :" " )。 22 COUT << ENDL。 23 リターン 0 ; 24 }