チームのMoアルゴリズム(オフライン)

どのようなアルゴリズムのMoチーム

Mo Moのタオアルゴリズムは、チームのキャプテンの発明である。このアルゴリズムは、Moのチームと呼ばれているように、彼のために尊敬です。


スコープ

典型的には、複雑のルートを持つ広い範囲のOperationsのオフライン処理シーケンス、アルゴリズム。


Moのアルゴリズムチームの考え方

被写体が変更操作を必要としないものとします。

すべてのオフライン操作は、すべての動作は、第1の次元は、ブロック番号、第二次元は右点である左端の点で、タプルをソート。

キュー間隔内に答えを維持しながら、$からそれぞれ、両端キューを維持し、処理質問の順序を並べ替えた後、[L、R] $の答えは、$ [L-1、R] $ $ [Lに拡張しましたR-1] $ $ [この回答呼び掛け間隔最終的に得られたL + 1、R] $ $ [L、R + 1] $の答え。


時間の複雑さの解析

$ $、$ M $クエリ数、長さ分割Kuaikuai $ D $のN-系列長、同じブロックに次に左端点は、$ Dの$以下での左点を移動させる、合計右端を超えて移動しません$ N- $は、明らかに$ \シータは$ので、$ D = \ SQRT {N} $、$ N、Mの$同じ順序、時間複雑度(Mの\時間は、+、\ FRAC {N ^ 2}、{D} D) $ \シータ(n個の\ SQRT {N})$に、常熟は大きいです。


アルゴリズムの性質上のMo

Moのアルゴリズムがオフラインの場合は、お問い合わせや変更の間の順序を調整することで、チームの本質である、良い時間の複雑さと引き換えに、計算の優れた順に、未知の回答の回答に知られているから延びています。
各インタロゲーションの$ [Lは、R] $は$(L、R)$平面の全体のポイントとみなすことができ、他の呼掛け$(L、R)は、二つの質問の間に$転送間のマンハッタン距離であります価格。
私たちは、お問い合わせや転送間のコストを最小限に抑え、順序を調整するだけです。
ポイントは、スパニングツリー、最適な計算手順マンハッタンの最小値であるが、この事を解決するために非常に面倒なので、コードの複雑さのバランスと時間複雑性を得るために、この方法は、暴力のより直接的なものです取ります。


ときのMoアルゴリズムチーム

操作は、対象の、より複雑な要件である場合、オフラインでは、Moのチームを使用することを検討してメンテナンス情報、または維持するための情報の高い複雑さ、および時間の少ない厳しい要件の対象ではない容易にしない場合、他のセグメントのツリーデータ構造を持つよりも制限されます。
時間複雑通常ルートで、高いモリブデンとチームの複雑さを変更し、定数や大型、あなたが直接セグメントツリーをブロックすることができるか、問題を取り除く場合には、Moのチームを使用しないようにしよう、いくつかの問題が本当に遅い実行している(も、あなたの場合計算時間の複雑さは)非常に良いです。

条件:

  望遠端$ [のL、R] $回答シーケンスの周りに、複雑さはたったの$ \シータ(1)$です。いくつかの$ \シータ(\ n個のログを)強制的にMoのチームとの回答を転送することは$ $ \シータはO(n ^ 2)は、高速暴力的な実行を$よりも良い行います。


注意を払います

  1 ++と - は前面または背面にあります。

  2.通常の状況下では、四則演算の順序を重要ではありませんが、いくつかの質問には、例えば、影響力のある:BZOJ4358:permu。


 

コードの時間

通常のMoチーム:

構造体REC 
{ 
	int型のID。
	int型のL; 
	int型のR; 
	int型のPOS。
} Q [N]。
[N] INT。
INTのANS [N]。
ブールCMP(REC B、REC){a.pos戻り== b.pos AR <BR:a.pos <b.pos;} 
int型のmain()
{ 
	int型N、M。
	scanf関数( "%d個の%のD"、&N、&M)。
	INT、T = SQRT(N)。
	(I 1 = int型、iが<= N; iが++)のため
		のscanf( "%dの"、および[I])。
	以下のために(INT I = 1; I <= M; iは++)
	{ 
		scanf関数( "%d個の%のD"、&Q [i]は.L&Q [I] .R)。
		Q [i]はiは= .ID。
		Q [i]は.POS =(Q [i]が.L-1)/ T + 1。
	} 
	ソート(Q + 1、Q + M + 1、CMP)。
	INT 1 = 1、R = 0。
	以下のために(INT I = 1; I <= M; iは++)
	{ 
		一方(L> Q [i]は.L)UPD( - L、1); 
		一方、(R <Q [I]。
		一方、(L <Q [i]が.L)UPD(L ++、0); 
		一方、(R> Q [i]は.R)UPD(R - 、0); 
	} 
	(i = 1 int型; I <= M; iが++)のため
		のprintf( "%d個の\ n"、ANS [I])。
	0を返します。
}

パリティのMoチーム:

BOOL CMP(REC B REC){リターン(a.pos)^(b.posを)ら<BL:(((a.pos)&1)AR <BR:AR> BR);}?

RP ++

おすすめ

転載: www.cnblogs.com/wzc521/p/11240671.html