ミックスフルーツジュース:全体の半分、セグメントツリー

$説明:$

Rは、小さな暗い料理、特にミックスフルーツジュースを行うことを熱望します。

ストアは、n個のフルーツジュースを持っていた1〜n個の番号が付け。おいしいジュースのI番号は、ミックスフルーツジュースの生産に$ P_I $の。小さなRリットルの価格につき、$ D_I $である、すなわちジュースの瓶の中に混入し、いくつかの特別な規定が、そこにある、ジュース私の番号は$まで追加します$リットルをL_iを。

今、小さな子供たちを探して、mはR混合果汁飲料にそこに来ている、彼らはすべてのジュースの瓶の中に混ぜ少しRストアジュースを作りたいです。
ここで、彼は$ $ G_J、以下$ L_j $以上のボリュームの合計金額よりも大きいを取得していないジュースをミックスすることが望ましいm番目の子。
これらの制約の下で、子どもたちもできるだけ高いとしてフルーツジュースのおいしいミックスをしたい、おいしいミックスフルーツジュースのボトルは、すべての参加ジュース混合おいしい度の最小値に等しいです。それぞれの子のフルーツジュースミックスドリンクの一番美味しい味を計算してください。
$ N、M、P_I、L_iを 、D_I \ル100000、g_j、L_j \ル10 ^ 12 $

今日は、ちょうど全体の二分法を学び、質問をしよう。

実際には、全体の半分と半分が、ちょうどオフ一緒にそれの半分ダウンし、その全体の半分と呼ばれるほぼ正常です。

多くの場合、時間の$高い複雑さをチェックし、単一の$で適用されます。

一般的な形態、すなわち$(L、R、L、R)$を解決し、それぞれは、応答呼掛けフィールド区間を表します。

そして、MID $ $の状態を調整するために、データ構造などを変更します。その後、すべてのお問い合わせには答えは半ば$ $以上であるかどうかを確認するために、データ構造を使用して。

以上$半ば$場合は、左と右のセクションまたはセクションにそれを置きます。再帰的に解決しました。リーフノードへの答えです。

 

この質問は実際には非常にテンプレートです。あなたは言葉の全体の二分法を知っていれば。

秩序の度合いに応じて、直接各おいしいジュースは、その後、答えの半分は、インデックスが可能です。

$チェック$の半分は$半ば$よりも大きいの子供たちと一緒においしいジュースのいずれかを購入し、あなたはジュースの十分な量を得ることができるかどうかを確認するために見ることです。

2分後、フルーツジュースのおいしさの区別は限り以上でMID $ $ラインとして、ありません。私たちは、価格と数量を気に。

このケースでは、安価に購入することを確認しています。価格お問い合わせや注文接頭辞、削除、追加するためのサポートを維持するために。

価格指数は重みの合計飲み物や合計金額を維持し、ライン上のツリーラインを構築します。

あなたが現在の間隔のすべてを購入することができた場合はそれを購入します。あなたは余裕がない場合はそれ以外の場合は、彼の息子が左再帰の中に彼の息子を残し、再帰は、右の息子に、息子を左に余裕があります。ライン上の特別取扱リーフノード。

$長い$ [ミッド+ 1、R] $セグメントツリー果汁を添加したとして、全てのお問い合わせは、$ $ $を確認し、左の息子、解決策を(L、R、L、R)を解決するため、セグメントツリーからこれらのジュースを入れるには削除車線、右の息子を解決します。

したがって、セグメントツリーの総数が変更され、区間長、すなわち$ O(N \ログ\ n)は、$。お問い合わせ番号は、問題のパーティション層の数を乗じて$ O(Q \ \ n個のログ)$です。

全体的に複雑$ O((N + Q)は、n \ログ)$

1の#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  の#defineっ長い長
 4  の#defineが 100005 S
 5  の#defineのLC P << 1つの
 6  の#defineのRC P << 1 | 1つの
 7  の#define中間(L + R >> 1)
 8  INT ANS [S]、N、 Q; LL TOTP [S << 2 ]、TOTL [S << 2 ]。
9つの 構造体 PS { int型の P、V; LL L;友人ブール 演算子 <(PS A、PS B){ 戻り AV < BV;}} P [S]。
10の 構造体 QS {LL M、W。int型O;} Q [S]、RQ [S]。
11  ボイド追加(INT PR、LL L、INT P = 1INT、L = 1INT R = 100000 ){
 12      TOTL [P] + = L; TOTP [P] + = L * PR。
13      であれば(L == R)のリターン;
14      であれば(PR> MID)追加(PR、L、RC、中間+ 1 、R)。
15      他の追加(PR、L、LC、L、MID)。
16  }
 17(ASK llのLL M、INT P = 1INT、L = 1INT R =100000 ){
 18      であれば(M> = TOTP [P])戻りTOTL [P]。
19      であれば(L == R)戻り M / L。
20      であれば(M> = TOTP [LC])戻り TOTL [LC] +尋ねる(M-TOTP [LC]、RC、中間+ 1 、R)。
21      リターン(M、LC、L、MID)尋ねます。
22  }
 23  ボイド(解決int型 L、INT R、INT QL、INT {QR)
 24      場合(L == R){ 一方(QR> = QL)[Q [QR]の.o] = P [L] ANS。 V、qr--。リターン;}
 25      int型PL = QL、PR = QR、MD = L + R >> 1 26      のためにINT I = MD + 1 ; I <= R; ++ I)を追加し(P [i]は.P、P [i]は.L)。
27      のためにINT ; I <= QR; ++ I I = QL)場合(ASK(Q [i]は.M)> = Q [i]は.W)RQ [PR - ] = Q [i]は、他の RQ [PL ++] = Q [i]は、
28      のためにINT I = QL; I <= QR; ++ I)Q [I] = RQ [I]。
29      解く(L、MD、QL、PL- 1 )。
30      のためにINT I = MD + 1 ; I <= R; ++ i)が追加(P [i]は.P、 - P [i]の.L)。
31      解く(MD + 1 、R、PL、QR)。
32  }
 33  INT メイン(){
 34      CIN >> N >> Q、P [ 0 ] .V = - 1 35      のためにINT iは= 1 ; I <= N; ++ I)のscanf(" %D%D%LLD "、&​​P [i]は.V、&P [i]は.P、&P [i]は.L) ;
36      のためにINT iは= 1 ; iが<= Q; ++ I)のscanf(" %LLD%LLD "、&​​Q [i]は.M、&Q [i]は.W)、Q [i]はの.o = I。
37      ソート(P + 1、P + N + 1 )。
図38は、      (解決0、nは、1 、q)を。
39     INTは iは= 1のprintf(++ I; I <= Q)" は%d \ n " 、ANS [I])。
40 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/hzoi-DeepinC/p/12304797.html