羅区トピックリンク:シーケンス合併
タイトル説明
2つの長さNのシーケンスA及びBがあり、AとBで添加番号を示すことNとすることができる2ヶ月と、この要求N 2 2及びNの最小
入出力フォーマット
入力フォーマット:
Nの整数正の最初の行。
Nの整数Aの第2行I満足A I ≤A 。I + 1及びA I ≦10 9。 。
Nの整数Bの第3行I B満たし、I ≦B I + 1及びB I ≦10 。9。
[データ]スケール
データの50%、満足1 <= N <= 1000。
データの100%まで、満足1 <= N <= 100000。
出力フォーマット:
わずかから大きな出力を、N個の整数を含む出力ラインは、N及び最小の隣接する数字間のスペースで区切られました。
サンプル入力と出力
入力サンプル#1:
3
2 6 6
1 4 8
出力サンプル#1:
3 6 7
トピックイタリア: 2長さ単調に増加するシーケンスをnで構成されてもよい、N 2つの組み合わせ、これらのQの組合せN最大前番号。
ソリューション:
下の表で一見:
[1] + B [1] <= A [1] + B [2] <= ... <= A [1] + B [N]
[2] + B [1] <= A [2] + B [2] <= ... <= A [2] + B [N]
......
[N] + B [1] <= A [N] + B [2] <= ... <= A [N] + B [N]
明らかに、同じ列に、各列の値は、トップラインよりも大きくなっています。
そこで、我々は可能な第1のA 1〜N-及びB 1つの値は最小ヒープをとるそれぞれの場合に、スタックに追加され、スタックは次の行に入れ、これは単調性を保証することができ、添加されます。
1の#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 CONST INT N = 100000 + 5 。 4 5 INT N、[N]、B [N]、[N] ANS。 6 7 構造体の数{ 8 INT ID1、ID2、ヴァル。 9 ブール 演算子 <(CONST番号&)のconst { 10 リターン値> a.val。 11 } 12 }。 13 14 PRIORITY_QUEUE <番号> H。 15 16 INT メイン(){ 17の IOS :: sync_with_stdio(偽)。 18 CIN >> N。 19 のために(INT iは= 1 ; iが<= N; I ++)CIN >> [I]。 20 のために(INT iは= 1を CIN >>; <I = N I ++)B [i]は、 21 のために(INT iは= 1 ; iが<= N; I ++)h.push((数){I、1、[I] + B [ 1 ]})。 22 のために(INT iが= 1 ; iが<= N; I ++ ){ 23 数トップ= h.top()。h.pop(); 24の ANS [I] = top.val。 25 h.push((番号){top.id1、top.id2 + 1、[top.id1] + B [top.id2 + 1 ]})。 26 } 27 のために(INT iは= 1 ; iが<= N; I ++)COUT << ANS [I] << ' '。coutの<< てendl; 28 リターン 0 ; 29 }
-