線性基里集合的線性組合能表示出原陣列的異或組合
依次插入數,從位數的高到低插入
如果該位無元素\((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...