2019頭の牛とより多くの乗客大学三のA.グラフゲーム(ブロック図)

効果:図セット$所与なし(X)$と$ S($ Sを求め、$ Xの$フリップ$ [のL、R] $レンジ片面当たり隣接小数点演算の(x)は$ Sに定義されていません。 Y)$は等しいです。

 

高速決意はそれぞれ$のULLの$のために乱数を取って、$ハッシュ$を使用する。$ CF 799F $技術に等しく設定され、排他的に、または決定され等しくすることができます。

その後、ブロッキングの程度を考慮してください。

光の点に関しては、1つのアイデアは、ハードカードが$ログ$の複雑さにもそうもがあるかどうかを判断するために暴力、フェンウィックツリーに隣接するクエリー側を列挙することです。

より良いアプローチは、代わりに木ブロックのアレイを使用して、$ O(1)$クエリを達成することです。

強調のため、各キーは$ X $の主要な貢献は、$ X $ $ $ベクトルの期間内に連続されるたびに更新隣接エッジの$ $ベクトルを格納することができるが、これは、位置を決定するために、2つの点を必要とします。

より良いアプローチは、サイドブロック、ブロック毎に各プリエンファシスの効果を考慮することで、その後境界暴力に、全体が各マーカーは問い合わせることができ修正暴力クエリをマーキング。

#include <iostreamの> 
する#include <ランダム> 
の#include <cstdioを> 
する#include <math.h>の
に#define REP(I、N)のための(iは= int型、iが<= N; I ++)
の#define - PER(I、N)のための式(I; I> = A I = N INT)
の#define PB一back 
の#define X最初
の#define yは第
名前空間stdを使用。
typedefの符号なしlong longのULL。
typedefのペア<int型、int型> PII。
CONST int型N = 2E5 + 10。
INTのN、M、U [N]、V [N]、度[N]。
チャーANS [N]。
ベクター<PII>小[N]。
INT S、C [N]、C2 [N]、C3 [N]、ID [N]。
[800] [800] F ULL。
ULL [N]、S [N]。
ボイドUPD(INT X){ 
	REP(I、X / S * S、X)C [I] ^ = 1、S [U [I] ^ = [V [I]、S [V [i]は] ^ = [U [I]]。
	PER(I、0、X / S-1)C2 [I] ^ = 1、C3 [I] ^ = 1;
ULLクエリ(INT X){ 
	戻りC1 [X] ^ C2の[X / S]。	
} 
ULL QRY(INT X){ 
	ULL ANS = 0。
	IF(ID [X]){ 
		PER(I、0、M / S)IF(C3 [i])とANS ^ = F [i]が[ID [X]]。
		戻りANS ^ S [X]。
	} 
	(自動E:小さな[X])のためのIF(クエリ(EX))ANS ^ = [EY]。
	ANSを返します。
} 

のstd :: MT19937 RD(時間(0))。
ボイドの仕事(){ 
	scanf関数( "%d個の%のD"、&N、&M)、S = 1.5 *のSQRT(M)。
	REP(I、0、M + 5)C [I] = C2を[I] = C3の[I] = 0; 
	REP(I、0、N + 5)S [I] = ID [I] =゜[I] = 0、小[I] .clear(); 
	REP(I、1、M){ 
		scanf関数( "%d個の%のD"、U + I、V I +)。
		++度[U [I]、++度[V [i]は]。
	} 
	UPD(M)。
	REP(I、1、N)の場合(DEG [I]> = S)ID [I] = ++ * ID。
	PER(I、0、M / S)REP(j、0、* ID)[I] [J] = 0 F。
	スロー(S> = 800)であれば、
	スロー(* ID> = 800)であれば、
	(800 = M / S>)もし投げます。
	REP(I、1、M){ 
		int型ID = I / S。
		IF(ID [U [I])F [ID] [ID [U [I]]] ^ = [V [I]]。
		他の小[U [I] PB(PII(I、V [I]))。
		IF(ID [V [I])F [ID] [ID [V [I]]] ^ = [U [I]]。
		他の小[V [I] PB(PII(I、U [I]))。
	} 
	int型Q、CNT = 0。
	scanf関数( "%のD"、&Q)。
	一方、(q--){ 
		int型のOP、X、Y。
		scanf関数( "%D%D%D"、&OP、およびX&Y)。
		IF(OP == 1)UPD(Y)、UPD(X-1)。
		他ANS [++ CNT = QRY(X)== QRY(y)は'1': '0'。
	} 
	ANS [CNT + 1] = 0; 
	プット(ANS + 1)。
} 
int型のmain(){ 
	REP(I、0、
	int型のトン。
	scanf関数( "%のD"、&T)。
	一方、(t--)ワーク(); 
}

 

おすすめ

転載: www.cnblogs.com/uid001/p/11261529.html