zcmu 1540 K-タルスス

1540:最初多数K
制限時間:10秒メモリ制限:128メガバイト
[登録] [状態] [ウェブボード]
説明
二つの配列、B、それらのそれぞれの長さnおよびmは、2つの配列がありますk番目の要素である乗じた降順の要素に対応するn×m個の要素は何ですか?

入力
最初の行為入力の正の整数T(T <= 10)、Tは、テストデータの全セットを表します。

各テストの最初の行に3つの正の整数nは、配列の長さを表すmおよびK(1 <= N、M <= 100000,1 <= K <= N * M)、配列の長さB 、および要素のインデックスをお願いします。n個のシーケンスAの動作を表す第2の正の整数。M系列Bの動作を表す第3の正の整数。配列満足のすべての要素の大きさ[1,100000]。

出力
各テストケースについては、出力線であるk番目の要素を表す大きな整数を含みます。

サンプル入力
3
3 2 3
1 2 3
1 2
2 2 1
1 1
1 1
2 2 4
1 1
1 1
サンプル出力
3
1
1

明らかに、この質問は、最初の、B一定である配列を並べ替えます。
その後、L = [0] * B [0]、R = [N-1] * B [M-1]いくつかの中間の数を見つけるために始めています
このアイデアのいくつかの大規模な数のも、最初は直接TLEに関連されることはありません外の半分に加えて。探しは初めていくつかの大きな数字です。コードの特定のコメントを参照してください。
MIDは、直接結果を返す条件を満たしていない注意を払うように、第2のサブ時に説明するがある場合、この時間は、最初の中間のk + 1と大量のk番目の最大数との間であってもよいです。
#include <cstdioを> 
する#include <アルゴリズム>
 使用して 名前空間STD; 
 
int型N-、M、K;
 ロング・ ロング [ 100000 ];
 ロング ロング B [ 100000 ];
 
アイデアの数// O(M + n)はによってあります、属するいくつかの数字で得られたC Bペアワイズ配列
ロング ロングジャッジ(ロング ロングMID) { int型 SUM = 0 ; int型 J = 0 ; のためのINT I = N- 1、I> = 0 ; I - )//は、最大Iの列挙を開始するため、私は、順序付けられている場合をB列挙完了後の状況、特定のI-1の場合には、その後の列挙の確立 以下のために(; J <M、J ++ )// [I + 1] [jは 】 時間を満たすことができないが、[i] [j]は、特定の満たされていない、以前によれば、列挙ここでは繰り返しません行に記録ホイール結果 場合([I] * B [j]> = MID) { SUM + M- = ; // jは、後続の結果が特定の満足されたとき満足するjの ブレーク; } 戻りSUM ; } int型のmain() { int型 PP; scanfの(" %のD "、&PP); 一方(PP - { scanfの(" %D%D%D "、およびN-、&M&K) のためのINT I =0 ; iがn <; iは++)のscanf(" %dの"、および[I]);ソート(+のN)。 以下のためにint型、I = 0のscanf(iは++; iがm <)" は%d "、&​​B [I])を、ソート(B、B + M)。 長い L = [ 0 ] * B [ 0 ]。 長い 長い R = [N- 1 ] * B [M- 1 ]。 長い 長いANS; 一方、(L <= R) { 長い 長い半ば=(R + L)/ 2 int型の合計=裁判官(中旬)。 もし(和> = K) ANS =中間、L =ミッド+ 1 他に 、R =半ば1 } のprintf(" %LLDする\ n " 、ANS)。 アウト:; } 戻り 0 }

 

おすすめ

転載: www.cnblogs.com/z1141000271/p/11443331.html