線性基小結

2022-05-20 19:35:37 字數 1231 閱讀 3111

線性基里集合的線性組合能表示出原陣列的異或組合

依次插入數,從位數的高到低插入

如果該位無元素\((0)\),將目前元素放進去

如果改為有元素,異或後處理更低一位

插入失敗:\(x\bigotimes d[a]\bigotimes d[b]\bigotimes d[c]...\bigotimes d[z]=0\)

插入成功:插入\(y=x\bigotimes d[a]\bigotimes d[b]\bigotimes d[c]...\bigotimes d[z]\ne 0\),利用\(y\)元素,實現異或全排列

所以線性基里的元素個數是最少的

在目前線性基中插入\(b\)和\(c\)均失敗的情況下

變化線性基(拿出原陣列中的乙個元素)若插入其中乙個成功則另乙個不成功

假設要插入\(b\)和\(c\):\(b=d_i \bigotimes d_j \bigotimes d_k...\bigotimes d_z\)

把其中乙個數刪掉後,其實等同於自己替代了那個位置,\(c\)還是插不進

異或最大值:貪心從高到低貪心選擇或不選擇

異或最小值:貪心從低到高位選擇第乙個非空元素

異或判特值:貪心處理直到為\(0\)

異或個數:因為每個元素都是處理出來相對獨立的,答案為\(2^\)

異或\(k\)小值:\(2^i\)小值就是第\(i-1\)個元素貪心地與前面處理的結果,然後對\(k\)拆位處理

線性基合併:暴力插入即可

# include using namespace std;

typedef long long ll;

ll bit[64], a[64], x, k;

int main(){

int n, m, cnt=0;

scanf("%d",&n);

for(int i=0; i= (1ll《區間查詢異或最值

解法一:離線處理排序右端點,每次插入的時候越末插入越優,所以盡量把向量換成新插入的點 code

每個物品都有價值與標號,求在選出的集合子集標號異或不為\(0\)的最大價值

由性質可得乙個貪心做法:不斷插入到線性基,插入成功則答案加上**

無向邊權圖\(1\)到\(n\)可重邊路徑異或最大值

預處理每個環的異或值,這個值是可以單獨算的,而環與環之間的鏈其實通過兩次異或能忽略不計

而\(1\)到\(n\)的鏈隨便選就行了,如果有多條路徑,這種環也可以通過異或得到最大鏈

然後通過線性基得到最大值

模板 線性基

難度較大,請勿棄療 給定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...