線性基學習筆記

2022-05-04 13:27:11 字數 939 閱讀 4499

線性基是一種擅長處理異或問題的資料結構。設值域為\([1,n]\),就可以用乙個長度為\(\lceil \log_2n \rceil\)的陣列來描述乙個線性基。特別地,線性基第\(i\)位上的數二進位制下最高位也為第\(i\)位。

乙個線性基滿足,對於它所表示的所有數的集合\(s\),\(s\)中任意多個數異或所得的結果均能表示為線性基中的元素互相異或的結果,即意,線性基能使用異或運算來表示原數集使用異或運算能表示的所有數。運用這個性質,我們可以極大地縮小異或操作所需的查詢次數。

我們考慮插入的操作,令插入的數為\(x\),考慮\(x\)的二進位制最高位\(i\),

如果退出時\(x=0\),則此時線性基已經可以表示原先的\(x\)了;反之,則說明為了表示\(x\),往線性基中加入了乙個新元素。

很容易證明這樣複雜度為\(\log_2x\),也可以用這種方法判斷能否通過原數列異或得到乙個數\(x\)。

**:

void insert(ll x)

else x ^= b[i];

} }

return;

}int check(ll x)

查詢最小值相對比較簡單。考慮插入的過程,因為每一次跳轉操作,\(x\)的二進位制最高位必定單調降低,所以不可能插入兩個二進位制最高位相同的數。而此時,線性基中最小值異或上其他數,必定會增大。所以,直接輸出線性基中的最小值即可。

考慮異或最大值,從高到低遍歷線性基,考慮到第\(i\)位時,如果當前的答案\(x\)第\(i\)位為\(0\),就將\(x\)異或上\(a_i\);否則不做任何操作。顯然,每次操作後答案不會變劣,最終的\(x\)即為答案。

同樣,我們考慮對於乙個數\(x\),它與原數列中的數異或的最值如何獲得。用與序列異或最大值類似的貪心即可解決。

**:

ll qmax()

ll qmin()

線性基學習筆記

線性基是幹嘛的呢?給定n個數,求所有數的異或和最大是多少?求解這類問題的時候,就需要線性基了 個人感覺線性基本身就一種貪心。首先定義ba se i bas e i 表示最高位1在i位的數是什麼 對於新進來的數tm p tmp 我們先找出他最高位上的1,假設為第 j j 位,然後看一下ba se j ...

線性基 學習筆記

includeusing namespace std using ll long long const int maxn 5e5 5 原來的數 const int maxbit 63 ll a maxn 原來的數 ll p maxbit p j 第j位為最高位1的數 最高位1在第j位的數 int m...

線性基 學習筆記

按位計算,如果相同記為0,不同記為1。如果,a b c,c b a 交換律結合律 對於任何數,x x 0,x 0 x 對 於一 段序列a n,異或 和為a1 a2 an 對於一段序列a n,異或和為a 1 a 2 a n 對於一段序列 an 異或和為 a1 a2 an 設t s,所有 這樣的子 集t...