アリーシャのパーティー
制限時間:2000分の3000 MS(Javaの/その他)メモリの制限:131072分の131072 K(Javaの/その他)
の合計提出(S):7971受理提出(S):1833
説明
王女アリーシャは彼女の誕生日パーティーに来て彼女の友人を誘います。彼女の友人のそれぞれは、いくつかの値vの贈り物をもたらすでしょう、そしてそれらのすべては、異なる時間に来ます。ロビーの大きさが十分でないので、アリーシャは一度にに少数の人々を聞かせすることができます。彼女はその贈り物最高値を持つ最初の入力の人を聞かせすることを決定します。
アリーシャがドアを開いたときにするたびに、彼女は、pの人々は彼女の城を入力できるように決めることができます。p以下の人がロビーに存在する場合、それらのすべてが入力します。彼女の友人のすべてが到着した後、アリーシャは再び扉を開き、今回はまだ入っていないすべての友人のように入力します。
同じ値の贈り物を持って来る二人の友人がある場合は、最初に来る1は、最初に入力する必要があります。クエリーnを考えると、彼女の城を入力するには、n番目の人物が誰であるかアリーシャを教えてください。
入力
入力の最初の行は、テストケース、T、1≤T≤15の数を与えます。
各テストケースでは、最初の行は、空白で区切られた3つの数字K、MおよびQを含有します。kは1≤k≤150,000招待彼女の友人の数です。すべてのアリーシャの友人はどこ0≤m≤k到着する前にドアがm回を開きます。アリーシャは1≤q≤100Qクエリを持っています。
以下のK線のi番目のはせいぜい200個の英語の文字から成る文字列のBi、および空白で区切られた整数VI、1≤vi≤108を与えます。Biがアリーシャのパーティーに来てi番目の人物の名前であるとBiは、値のviの贈り物をもたらします。
次のm行の各々は、T(1≤t≤k)及びP(0≤p≤k)は空白で区切られた2つの整数を含みます。t番目の人が到着した後、ドアは右開き、アリーシャは、pの友人は彼女の城に入るようになります。
各テストケースの最後の行は、Q番号N1、...、アリーシャは彼女の城を入力するためのN1番目、...、NQ-番目の友人が誰であるか知りたい意味スペースで区切ってNQが含まれています。
注意:n>は10000を含む最大2つのテストケースがあるでしょう。
出力
各テストケースのために、出力スペースで区切られたアリーシャのクエリの対応する名前。
サンプル入力
1
5 2 3
Sorey 3
ローズ3
Maltran 3
レリエル5
Mikleo 6
1
4 2
1 2 3
サンプル出力
効果の対象に
アリーシャパーティーを開催する予定で、kのゲストがあるでしょう、それぞれのゲストは、viの贈り物の価値を持つことになりますが、アリーシャは、同時に多くの人々を受け取ることができないので、彼女がドアを開くために、数回に分割されます、少数の人々が入って来入れ、タイトルを与えますM、P及びTの数は、それぞれ、即ち、最初の到着パーソナルTの後、ドアを開いて、最初のP個体がキューから出てきます。ラインアプローチは、フロントへの最初の駅の値として、贈答品の価値に基づいて、ハイからローにランクされています。最後に、すべての人が来ます。最後に、q個のクエリは、いくつかの最初の来ることを誰尋ねます。
このようなタイトルとして、Soreyはそれが、Soreyあり、中に来て人を置くためにドアを開くために最初の人の後に、アリーシャを先着順。その後ローズ、Maltran、レリエルはレリエル貴重な贈り物ので、来ているので、彼はMaltranギフトやローズなど、前に立って、今二人の男が入って来た前に、アリーシャはドアを開けると、それはレリエルバラで、バラの後ろで来ました。その後MikleoフロントMaltran 6への贈り物の価値のための立場を取って、順序があるので、最終的に彼らはドアに来た:SoreyレリエルローズMikleo Maltranをクエリ出力のためには、個人の3倍の最初の3つの名前です。
分析
このトピックでは、明確に使用するプライオリティキューですが、私はいつも、突然実現し、他の人のコード読んだ後RE:メートルの数に指定されたタイトルを、tは11のサンプルことを意味し、注文することは必ずしもありませんそして42を逆にすることができます!!だから、あなたが入力をシミュレートすることができないとき(REの元は、このような小さな弱い.....鶏が学んだことも可能である)私はREされている理由である、完全です
コードの実装
#include <ビット/ STDC ++ H> 使用して名前空間STDを、 typedef 構造体ノード { int型VUL。 int型NUM; 文字名[ 205 ]。 フレンドブール演算子 <(CONSTノードと、CONSTノード&B) { 戻り a.vul <b.vul || (a.vul == b.vul && a.num> b.num)。 } } vistor。 PRIORITY_QUEUE <vistor> PQ; vistorのV [ 150005 ]。 INT ANSS [ 150005 ]、W [ 150005 ]。 INT のmain() { int型のT。 cinを >> トン。 一方、(t-- ) { memsetの(V、0、はsizeof (V))。 memset(ANSS、0、はsizeof (ANSS))。 memset(W 0、はsizeof (W))。 しばらく(!pq.empty()) pq.pop(); int型、K、M、Q、I、J、S = 1、R = 0 、X、Y。 scanf関数(" %D%D%D "、&K、&M&Q)。 用(i = 1 ; iは= K <; iは++ ) { scanf関数(" %sの" 、V [i]の.names)。 scanf関数(" %のD "、&V [i]の.vul)。 V [i]は.num = I。 } のための(i = 1 ; I <= M; iは++ ) { scanf関数(" %D%dの"、およびX&Y)。 [X] W + = Y。 } のための(i = 1 ; iは= Kを<; Iは++ ) { pq.push(V [I])。 一方、 - (W [i]が) { 場合(!pq.empty()) { ANSSの[S ++] = 。pq.top()NUM。 pq.pop(); } } } ながら(!pq.empty()) { ANSSの[S ++] = pq.top()NUM。 pq.pop(); } のための(i = 1 ; I <= Q; iは++ ) { scanf関数(" %のD "、&x)は、 もし私(!= Q) printf(" %sの" 、V [ANSS [X]]名。) 他 のprintf(" %sにする\ n " 、V [ANSS [X]]名。) } } }