CodeForces 242E "セグメント上のXOR"(ツリーライン)

 

ポータル

 

•問題の意味

  あなたの数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演算は、バイナリーであるように設計されているからです。

  だから、バイナリビットに従ってツリーラインの設立を検討してください。

  各リーフノードのために、各ビットに対応する数のノードに格納されたバイナリ情報に変換されます。

  そして、更新間隔、間隔クエリがあります。

•コード

  CodeForces242E(1)の.cpp

•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 \ \なります例} $。

  怠惰な怠惰と更新された親ノードと連携して、子ノードラベル怠惰な時間を伝え、

•コード

  CodeForces242E(2)の.cpp

おすすめ

転載: www.cnblogs.com/violet-acmer/p/11493713.html