両端キュー
2457 - HYSBZ制限時間:1秒メモリ制限:128メガバイト
説明
シェリーは今、困難な問題に直面して、N個の整数をソートする必要があります。いくつかの両端キューを使用することができシェリーのハンドツール。1:彼女はこの数Nに対処するために必要な、各数のために、シェリーは、2つのことを行うことができます。両端キュー、キュー内で一意の番号として現在の数を作成します。2。既存へのまたはキューの終了後に現在のヘッド番号の前に。すべて処理し、シェリーこれらのキュー順序付けられたシーケンス終了後非減少した後に得ることができます。
入力
最初の行は、整数N、整数の数を含んでいます。次のNラインDiが必要とされる処理の整数を表す整数ディを含んでいます。
出力
これは、必要な両端キューシェリー最小数のため、単一の行を含んでいます。
サンプル入力
6 3 6 0 9 6 3
サンプル出力
2
ヒント
200000≤100%データN。
分析:
この質問は複雑だと思うし始めている、数3は、スタック内に共存することはできません何の間の直接的な数学的関係をプッシュする試みで、昨日のソートダブルスタックを期待しないでください。しかし、達成することは困難であり、時間の複雑さは高すぎます。
この質問は、実際には、本当にこのシリーズを構築するために必要なキュー構造に限定されそうではありません。
正解は「これらのキューは、ノンドロップのシーケンスの後にソートすることができシェリー」によって実際には、隣接する区間の数を形成するかどうかを検討する前に直接ソートを考えます。
1.数はどのようなことのセクションで構成することができますか?
S = {
1
、
2
、
3
...
I-1
、
I
、
I + 1
...
N-1
、
N
}
=> {
1
} => {
1
、
2
、
3
} => {
5
、
4
、
1
、
2
、
3
}
=> {
I
、
I-1
、
I-3
、
I-2
、
I + 1
、
I + 2
}
ソートされたインデックスが最初の減少、つまり、「谷」を形成した場合は、その後、インクリメント:それは見ることができます。
![](https://img2018.cnblogs.com/blog/1717393/201907/1717393-20190718193357161-785130970.png)
2.どのように同じ番号に対処するには?添字交換の同じ数は、これの結果に影響を与えます。
この時点で、貪欲な戦略を使用して、異なる数の異なるセクション、下降間隔または増分で可能な限り同じ間隔によって添字番号を順次増加または減少に分けます。一例として、上記の図は、S = {3,1,6,2,5,4}は、間隔S = {{3}、{1,6}、{2,5}、{4}}を分割後に得られます。同じシーケンス番号間隔を入れ替えることができます。
間隔が最小カットオフ点未満であれば現在の時間間隔をインクリメント、それは単調減少となります。
現在の間隔は間隔が最大カットオフ点よりも大きい場合、それは単調になり、デクリメントされます。
ソート(A + 1、A + 1 + 、N-、CMP); [ 0 ] = .ORDER 0xFFFFFFF ; // 前処理後の境界条件を決定 [N- + 1 ] = .num 0xFFFFFFF ; BOOLの上昇= 0 ; int型 ANS = 0 ; INT J = 0 ; // 記録Jブレークポイント のための(INT I = 1 ; I <= N; I ++は) { 場合(上昇) { BOOL FL = 0 ; // 変更が増加または減少するかどうかのレコード 場合([I] .ORDER <A [J] .ORDER)=立ち上がり0、J = I、FLは= 1 ; 一方([I] == .num A [I +は1。 ] .num)I ++は、 IFを(! FL)Jは= I; } そうでなければ { int型 P = I; // この間隔が単調、減少増加または減少している場合は、この時点で変化しない抵抗は、iの最小値を表している 一方、([I] == A .numを[I +は1 Iは++).num] ; IF([I] .ORDER> A [j]は.ORDER)=ライズ1。、J = I、ANS ++ ; そう J = P; } } IF(上昇)ANS ++;!/ / 最後は単調にも別々のキューと見なさ谷を形成していない、減少している場合