專題 線性基

2022-10-09 23:09:18 字數 1151 閱讀 7529

線性基性質

線性基中所有的數都可以經過一些異或操作還原出原數列。

線性基任意幾個元素異或起來不為 \(0\)。

若這是原數列的線性基,那麼這一定是滿足性質 1,2 的元素最少的一種構造方案。

線性基推論

最多需要 \(\mathrm \) 個數,就可以通過異或操作轉化為乙個數列。

構造線性基

void add(ll x, int val) 

else x ^= p[i];

} }}

證明性質 1:

如果 x 被異或到了 \(0\),那麼一定存在一些線性基里的數可以異或得到它。

如果執行 p[i]=x,顯然也可以。

證明性質 2:

異或為 \(0\) 的話,本應該加進去的時候經過一些異或就變成 \(0\) 了,矛盾。

證明性質 3:yy 一下就可以了吧。可以證明加入的順序不改變線性基的元素個數。

另外,這個也可以判斷乙個數是否能被一些數異或得到。

求最大值

例題

for(int i = 60; i >= 0; i --) if((ans ^ p[i]) > ans) ans ^= p[i];
位運算的經典貪心,不展開了。

求最小值

線性基內元素個數 < 原數列元素個數,那麼加的時候一定有乙個數異或成了 \(0\),所以全域性最小值是 \(0\)。

線性基內元素個數 = 原數列元素個數,貪心,選 \(p[0]\)。

求k小值

例題先咕著。

合併

哈哈這個標題是詐騙的。

實際上列舉暴力差既可以了,時間複雜度:\(o(\log_2^2(n))\)。

元素刪除

哈哈也咕了。

例題

[bjwc2011]元素

[tjoi2008]彩燈

cf1100f ivan and burgers

scoi 2016 幸運數字

參考博文

模板 線性基

難度較大,請勿棄療 給定n個整數 數字可能重複 求在這些數中選取任意個,使得他們的異或和最大。n 50sample input33 21sample output 3看上去莫名其妙地想貪心。給些定義 s 為無符號整數集 即s n 記為 xor sum s x or s um s s1 s2 s s ...

模板 線性基

給定n個整數 數字可能重複 求在這些數中選取任意個,使得他們的異或和最大。線性基模板可解決 將n個整數看做集合a 線性基即為集合a的子集 線性基中每個元素的異或方案唯一,也就是說,線性基中不同的異或組合異或出的數都是不一樣的。線性基的二進位制最高位互不相同。這樣我們先構造出線性基 然後貪心的去搞最大...

線性基講解

1 線性基 若干數的線性基是一組數a1 a2,a na1,a2,an 其中axax 的最高位的11 在第xx位。通過線性基中元素xo rxor 出的數的值域與原來的數xo rxor 出數的值域相同。2 線性基的構造法 對每乙個數pp 從高位到低位掃,掃到第xx 位為11時,若ax ax不存在,則ax...