合成配列(優先キュー)

羅区トピックリンク:シーケンス合併

タイトル説明

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 1N-及び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 }

 

 

 

-

おすすめ

転載: www.cnblogs.com/jiamian/p/11176494.html