KPI
制限時間:1000分の2000 MS(Javaの/その他)メモリの制限:32768分の32768 K(Javaの/その他)
問題の説明
あなたは仕事の後、KPIはあなたのすべてと私はサービスを開発し、大きな人気を達成しています。延期十億は、フェルールからの要求を引きながら、大きなパイプにサービスを提供するよう要求します。各要求は重要な価値を持って定義してみましょう。I KPIは、パイプライン内の要求の現在の値によって重要な中間値が算出されます。今、時々私は中間の値の価値が現在のパイプラインの重要な要求を疑問に思う、あなたのサービスの記録を与えます。
入力
データの約100セット。
各データ行は、第有する N- (1 ≤ N- ≤ 10000 )、レコードサービス代表者の数。
次いで、n個の行があり、各列は三つの形式有する
「Xにおける」:キー値の代表X (0 ≤ X ≤ 10 。9 )パイプが進んで要求します。
「アウト」:パイプライン要求の頭に代わってサービスを引っ張っ。
「クエリ:。私はリクエストのm個が存在する場合、私は現在のパイプラインの昇順に、知りたい、と言うことですパイプラインの現在価値の重要な中間値に代わって要求を知りたいのF L O O R&LT (M / 2 )+ 1。T Hの 重要度の値要求された記事。
簡単な主題を作るために、xはすべて異なっており、導管内の値がない場合は、「アウト」と「クエリ」の操作があるでしょう。
各データ行は、第有する N- (1 ≤ N- ≤ 10000 )、レコードサービス代表者の数。
次いで、n個の行があり、各列は三つの形式有する
「Xにおける」:キー値の代表X (0 ≤ X ≤ 10 。9 )パイプが進んで要求します。
「アウト」:パイプライン要求の頭に代わってサービスを引っ張っ。
「クエリ:。私はリクエストのm個が存在する場合、私は現在のパイプラインの昇順に、知りたい、と言うことですパイプラインの現在価値の重要な中間値に代わって要求を知りたいのF L O O R&LT (M / 2 )+ 1。T Hの 重要度の値要求された記事。
簡単な主題を作るために、xはすべて異なっており、導管内の値がない場合は、「アウト」と「クエリ」の操作があるでしょう。
出力
各テストでは、最初の出力ラインの
ケースは#I:
次に、すべての「クエリ」、現在のパイプラインの重要な中間値の出力値を。
ケースは#I:
次に、すべての「クエリ」、現在のパイプラインの重要な中間値の出力値を。
サンプル入力
6
874で
質問
でる
24622で
12194で
質問
サンプル出力
ケース#1:
874
24622
アルゴリズム:体重セグメントツリー
解決策:この問題は、重みの特性に応じて、その後、セグメントツリーを離散化する必要があり、順次更新セクション番号のそれぞれの数、及びアナログキューのクエリの数に応じて、プリングヘッドパイプに質問、直接使用うまく。
書式#include <iostreamの> の#include <cstdioを> する#include <ベクトル> の#include <キュー> の#include <アルゴリズム> 使用して名前空間はstdを、const int型 MAXN = 1E5 + 7 。構造体のクエリ{ int型のオペアンプ。 int型のval; } Q [MAXN]。構造体ツリー{ int型のL、R、S。 }ツリー[MAXN << 2 ]。 ベクトル < int型 > V。 int型のn; int型のlen; int型を見つける(int型 X){ 戻り LOWER_BOUND(v.begin()、v.end()、X) - v.begin()+ 1 。 } ボイドのinit(){ ソート(v.begin()、v.end())。 v.erase(ユニーク(v.begin()、v.end())、v.end())。 LEN = v.size()。 } ボイドビルド(int型のルート、int型の L、INT R){ ツリー[ルート] .L = L。 ツリー[ルート] .R = R。 ツリー[ルート] .S = 0 。 もし(L == R){ リターン。 } int型半ば=(L + R)>> 1 。 構築(ルート << 1 、L、ミッド)。 構築(ルート << 1 | 1、ミッド+ 1 、R); } ボイド更新(int型のルート、int型の POS、int型のval){ int型 L = ツリー[ルート] .L。 INT R = ツリー[ルート] .R。 ツリー[ルート] .S + = ヴァル。 もし(L == R){ リターン。 } INT半ば=(L + R)>> 1 。 もし(POS <= MID){ 更新(根 << 1 、POS、ヴァル)。 } 他{ 更新(ルート << 1 | 1 、POS、ヴァル)。 } } int型の照会(INTのルート、int型K){ int型 L = ツリー[ルート] .L。 INT R = ツリー[ルート] .R。 もし(L == R){ 戻りL。 } int型の和=ツリー[ルート<< 1 ] .S。 もし(和> = K){ リターンクエリ(根<< 1 、K)。 } 他{ 戻りクエリ(ルート<< 1 | 1、K - 合計)。 } } int型のmain(){ int型 CAS = 0 。 しながら(〜のscanf(" %d個"、&N)){ ため(int型 i = 1 ; iが<= N; iが++ ){ チャー STR [ 10 ]。 scanf関数(" %sの" 、STR)。 もし [STR(0 ] == ' I ' ){ Q [i]は.OP = 1 。 scanf関数(" %のD "、&Q [i]は.val)。 v.push_back(Q [i]の.val)。 } そう であれば(strが[ 0 ] == ' O ' ){ Q [i]は.OP = 2 。 } 他{ Q [i]は.OP = 3 。 } } のinit(); (ビルド1、。1 、LEN); キュー < int型 > QUE; // このキューへと出てアナログデータ のprintf(" ケース#1%のD:\ N- "、++ CAS); のため(int型 I = 1 ; I <= N-; I ++は) { IF(Q [I] == .OP 。1 ){ int型の POS = (Q [I] .val)検索 更新(1、POS、1。); que.push(POS); } そう IF [Q(I ] .OP == 2 ){ アップデート(1、que.front() - 1 )。 que.pop(); } 他{ int型 K =(que.size()/ 2)+ 1 。 INT POS =クエリ(1 、K)。 printf(" %d個の\ n "、V [POS - 1 ])。 } } } 戻り 0 。 }