問題の魔法の解決策の羅区P2801リーダー

フェイス質問

時間のこの質問はちょうど差動ACの一定の接頭辞配列の最適化と最適化で木を見るためになっていますか?(このデータは、それは〜あまりにも多くの水です)

彼は非常に長い時間をデバッグ、最初のブロックのタイトルを行い、最終的には半分も上の誤解とは思いませんでした!これだけの記念(に注意を払うようにしてください)。

#include <ビット/ STDC ++ H> 
の#pragma GCCの最適化(2)
名前空間stdを使用。
[1000010]、B [1000010]、所属[1000010] int型。//原来的
INT怠惰[1000010]はL [1000010]は、R [1000010]。//块上的
INTブロック、TOT、N、M。
ボイドビルド()
{ 
	ブロック=のSQRT(N)
	TOT = N /ブロック。
	IF(N%ブロック){ 
		++ TOT。
	} 
	ため(; iは= <N; i = 1のとき、INTレジスタiが++){ 
		[I] = B [i]は、
		[I] =(I-1)/ブロック+ 1に属します。
	} 
	{式(I ++; I <= TOT I = 1 int型登録)するための
		ブロック+ 1 L [I] =(I-1)*。
		R [I] = iがブロックを*。
	} 
	R [TOT = N。
	用(i = 1 intを登録; I <= TOT; iが++){ 
		ソート(B + L [i]は、B + R [I] +1)。
	} 
	を返します。
}
空隙変化(int型のx、int型のY、int型K)
{ 
	場合(属し[X] ==属する[Y]){ 
		(I = xでintを登録する;私は= yと<; I ++の)のために{ 
			[I] + = K ; 
		} 
		([X] [属する] I = 1をint登録; iが<= R [X]属する]; iが++)のために{ 
			B [i]は[I] =。
		} 
		ソート(B + L、B + R [X]属する] + 1 [X]属します])。
		返します。
	} 
	(i = Xのint型登録iが++; iが<= R [X]属する])用{ 
		[I] + = K。
	} 
	([X] [属する] I = 1をint登録; iが<= R [X]属する]; iが++)のために{ 
		B [i]は[I] =。
	} 
	ソート(B + L、B + R [X]属する] + 1 [X]属します])。
	{(私は++; iは= Yを<[Y]属する] I = 1 int型登録)のための
		[I] + = K。
	} 
	([Y] [属する] I = 1をint登録; I <= R [Y] [属する]; iが++)のために{  
		B [i]は[I] =。
	}
	ソート(B + L [] Y [属する]、B + R + 1 [Y] [属します])。
	ための式(I = [x]は+1に属するintを登録する; iが<=属する[Y] -1; I ++){ 
		怠惰[I] + = Kと、
	} 
} 
int型の照会(int型のx、int型のY、INT目標)
{ 
	int型ANS = 0。
	{([X] == [y]の属する属する)場合
		(; iが<= yと; iが++ {I = xでint型登録)するために
			([I] +遅延[X]属する]場合> =目標)++ ANS; 
		} 
		戻りANS。
	} 
	(i = Xをint型登録; iについて<= R [属し[X]]; iは++){ 
		IF([I] +遅延[属し[X]]> =目標)++ ANS。
	} 
	([[Y]属する] I = 1をint登録;私は<; = yとIは++){ 
		(=目標[Y]属する] [I] +遅延)場合> ++ ANS。
	} 
	(iは=属するINT [X] +1登録iが++; iが= [Y] -1属する<)のための{ 
			INT半ば=(L + R)/ 2。 
		int型のL = 1 [i]は、R = R [i]は、中間と、
		<{(R L)、一方<てendl;  
	}
			IF(B [中間] +怠惰[I]> =目標){ 
				R =ミッド。
			} 
			他{ 
				L =ミッド+ 1。
			} 
		} 
		(L == R [I]){もし
			ANS + =((B [L] +怠惰[I])> =目標); 
			持続する; 
		} 
		ANS + =(R [I] -L + 1)。
	} 
	戻りANS。
} 
int型のmain()
{ 
	CIN >> N >> M。
	scanf関数( "%のD"、および[I])は、(i ++は; iが<= N I = 1 int型登録)するため、
	ビルド(); 
	(1 = I intを登録する; iが<= M; iは++){ 
		char型と、
		INT X、Y、K。
		CIN >> X >> Y >> Kを入力し、
		IF(タイプ== 'M'){ 
			変化(X、Y、K)。
		} 
		他{ 
			COUT <<クエリ(X、Y、K)<< ENDL。
} 

 

おすすめ

転載: www.cnblogs.com/kamimxr/p/11600198.html