https://ac.nowcoder.com/acm/contest/884/B
この問題は、最初の出会い線形関係トピック基、直鎖状溶液+イル交差セグメントツリーです。
この質問への対処では、私は、関連するナレッジベースの線形波を詰め込みます。
リニアグループの知識
1.リニア・グループとは何ですか
相互に排他的OR Sの元のセットを用いて得られた各XOR要素の範囲は、同じ範囲で得られるような元のS1(S1)の集合Sの最小サブセットによって。S1をSの元の直線群のセットであります
グループの2リニアな性質
-
グループは、すべての値の線形または相互に排他的なセットは、相互に排他的なオリジナルの取得または取得することができます。
-
リニアグループは、最低1の性質を満たすように設定されています
-
またはリニアグループは、排他的ではなく、サブセット0。
3.役割
グループの線形性質を定義によって、我々は知っている、一般的に設定された排他的論理和最大値、最小値、kの値が小さい、又は交差XOR範囲の複数のセットを解決し、シークする直鎖状の基です。
第二に、言葉遣い
1.建設イルリニア
B LL [ 70 ]; int型の追加(LL X) // 挿入Xリニアグループ { ため(int型 Iが= 63があり、I> = 0 ; i-- ) { IF!((X >>(LL)I) )続行 ; // xビットの最大値を見つけるIの1 IF(B [I])! // もし現在のB [i]は、線形群を挿入し、空である { [I] bは =のX; TOT ++。 // TOTは、直鎖状基が0の要素数ではない表す リターン 1。 ; // 成功挿入 } 他 X ^ B [I] =。 // [i]が空でないB場合、排他的OR X B [i]を見て継続 } 戻り 0 ; //は、インサートは、Xが失敗 }
2.セットを最大とXORを使用して
例:https://www.luogu.org/problem/P3812
まず、我々は最大の排他的または貪欲と排他的ORの行に値を大きくすることであってもよい最終的な答えを取るリニアベースのセットを、持っています。
LL ANS = 0 。 以下のために(int型 iは= 63、I> = 0 ; i--)場合(ANS <(ANS ^ B [I]))ANS ^ = B [i]は、
3.要件とXORの最小セット
排他的論理和が0であれば答えは、答えは0で、そうでない場合は、容易に明らかに設定することができますされ、最小値は、B [i]があります。
4. K-求めてXORの小さなセット
例:http://acm.hdu.edu.cn/showproblem.php?pid=3949
まず、もともと次の形式のリニアグループに加工します:
1xxxx0xxx0x
1xxx0x
1X
アプローチ:
以下のために(int型 i = 1 ; iは= < 63 I ++; ) のための(INT J = 0 ; J <I、J ++ ) 場合(B [i]が&(1 << J))Bは[i]を^ = B [jで];
初期値0への答えは、ビットが1であるかどうかを確認するためにバイナリ数kは、前記0この基は、直鎖状リニアグループに処理されることに注意して、排他的またはこの数の直鎖状の基をANS位置は無視されました。
LL ANS = 0 。 用(INT J = 0 ; J <= 63 ; J ++ ) { 場合(B [J]) { 場合(K&1)ANS ^ = B [J]。 K >> = 1 。 } } のprintf(" %LLDを\ n "、ANS)。
2つのグループは、リニアを組み合わせました
これは、グループA内の線状要素を順次線形グループBに挿入され、あまりにも単純であり、Bは、結合、線形の最後のグループであります
前記2つの直線の交点イル
例:https://ac.nowcoder.com/acm/contest/884/B
Biは、排他的OR得においてAおよびBi + 1の一定数のBmとにはいくつかの数値とすることができる場合、AとBの直線群は、Biは、採取すなわちA [A1] ^ A [A2] ^ ... ^ A [] ^ B [B1] ^ B [B2] ^ ... ^ B [BN] = B [i]は、すなわち、B [I] ^ A [A1] ^ A [A2] ^ ... ^ [] ^ B [B1] ^ B [B2] ^ ... ^ B [BN] = 0、= [1、N]、B = [I + 1、n]は、次いで、既知の[A1 ] ^ A [A2] ^ ... ^ A [] = B [I] ^ B [B1] ^ B [B2] ^ ... ^ B [BN] = C [I]、C [i]は、すなわち私たちは、インサート1をお答えしたいと思います。その後、我々は[A1] ^ A [A2] ^ ... ^ A []答えは、線形ベースを追加します。
LB(LB B LB A)マージ { LBすべて = A、C、Dを; // Cは、直鎖基が応答で、A XORから成るその各々におけるDのすべてのレコードがアウトビット )(C.clearします。 D.clear(); // 初期化するために覚えている ため(int型のI = 63であり、Iは> = 0 ; i--)Dbは[I] = 1LL << Iは、 のために(int型 = Iを63であり ; I> = 0。 i-- ) { IF (BB [I]) { BOOL CAN = 真に、 LL V = Bbの[I]、K = 0 ; のために(INT J = 63であり ; J> =0 ; J、 ) { IF)((V >> J)!続行; IF!(All.b [J]) // 現在のB [i]は排他的ORすべての得られた数でない場合は、挿入 { CAN = falseに ; // これはV答えない [J] All.b = V; DB [J] = K; BREAK ; } 他 { V ^ = All.b [J]; K ^ = DB [J]; } } もし(CAN) // vは最終0に等しい場合 、{ ため(INT J = 63であり ; J> = 0 ; J、 ) { IF(K&(1LL << J))= Abの^ V [J]; // A [A1] ^ A [A2] ^ ... ^ A [] 追加回答リニアイル } C.add(V); } } } 戻りC; }