•問題の意味
あなたの数nは2つの定義された配列に、操作含む配列を与えるために:
(1)$ 1、L、R:\ \ ANS = \ sum_ {i = L} ^ {R} a_iを$。
(2)$ 2、L、R、X:\ \ \ FORALL Iは、X $ \ [L、R]、a_iを= a_iを\ XORで\ \。
出力動作(1)値のANSに対応します。
•問題解決
動作は排他的OR、およびXOR演算は、バイナリーであるように設計されているからです。
だから、バイナリビットに従ってツリーラインの設立を検討してください。
各リーフノードのために、各ビットに対応する数のノードに格納されたバイナリ情報に変換されます。
そして、更新間隔、間隔クエリがあります。
•コード
•CF242Eアップグレード版
タイトルソース[ 2019ICPCアジア地域大会銀川カップ予選ステーションネットワークA.単純なデータ構造 ]
この質問に比べCF242E、2つの配列の操作が増加します:
(1)$ 1、L、R:\ \ ANS = \ sum_ {i = L} ^ {R} a_iを$。
(2)$ 2、L、R、X:\ \ \ FORALL Iは、X $ \ [L、R]、a_iを= a_iを\ XORで\ \。
(3)$ 2、L、R、X:\ \ \ FORALL iが[L、R]、a_iを= a_iを\で\ \ | \第X $
(4)$ 2、L、R、X:\ \ \ FORALL iが[L、R]、a_iを= a_iを\ \&\ X $の\ \
•アイデア
そして、トピックに関する同様のアイデアは、アカウントツリーライン保守操作上の開口部20を考慮して、
難易度はどのように怠惰で、どのようにプッシュダウン();
考慮に入れると、^、|、&特性;
進数のi番目のビットのために、「ビット[I]であると仮定されます。
易得ビット[i]は^ 0 =ビット[i]は、ビット[I] | 0 =ビット[i]は、ビット[I]&1 =ビット[I];
ビット[I] ^ 1:[i]の反転ビットに対応します。
ビット[I] | 1 = 1。
ビット[i]が&0 = 0。
それは有用であることが唯一の3つの操作の後です。
ビットを考慮[i]は以前より動作が順次行われてもよいです。
;ビットは、[i]はどんなに= 1、それは以前に行われた操作の種類1、|しかし、一つのことは、遭遇したビット[i]は確かです
同様に、遭遇したビット[i]が&0、ビット[I] = 0;
0であれば&1の面^ 1、ビットに対応する[i]の値は、最初に遭遇。
逆に、最初の発生した場合| 1、^ 1面には、[i]が0に割り当てられたビットに相当します。
この場合は、怠惰の定義は、4つの値があります。
$怠惰= \ {ケースを}開始-1 \ \ない\ \\ \ 0 \ \を操作する、\ \ \ 1 \\ \ 2 \ \なり、\ \端を{逆、\ 0 \\ \ 1 \ \なります例} $。
怠惰な怠惰と更新された親ノードと連携して、子ノードラベル怠惰な時間を伝え、
•コード