線性基 求抑或最值

2021-09-25 02:54:37 字數 1597 閱讀 5589

線性基:對一組數建立線性基得到:一組數a1,a2、、、an,其中ax:存最高位的1在第x位的元素值。

線性基作用:線性基的子集的抑或和的 值域與原數抑或和的值域相同。

性質1:線性基的任意子集的抑或和都不為0

對原陣列的每乙個數p,從高位到低位掃瞄,找到第一位為1的,若該位上的線性基ai不存在,則ai=p,否則p=p^ai,繼續掃瞄下一位。

像如果原數是2,3,則插入線性基中的是1,2 

ll b[63], nb[63], tot=0,flag=false; //b為線性基  nb用來求第k小異或值,基線性基中數 tot為nb元素個數,flag為true表示線性基外有數

void insert(ll x)

x ^= b[i];}}

flag = true;

}

ll max(ll x) 

ll min(ll x)

bool fin(ll x) 

}return 0;

}

把k二進位制拆分,如果k的第i位上是1,ans^=b[i]

ll b[63], nb[63], tot=0,flag=false; //b為線性基  nb用來求第k小異或值,基線性基中數 tot為nb元素個數,flag為true表示線性基外有數

void insert(ll x)

x ^= b[i];}}

flag = true;

}ll rebuild()

}for(int i = 0; i <= 62; i++)

}ll kth_max(ll k)

return res;

}

theme:給定n個魔石的編號和魔力值,如果一堆魔石中有子串的抑或和為0,則這堆魔石沒有魔力。問最多能達到多少魔力值?

solution:按魔力值排序,依次插入線性基,如果該元素可以插入,說明該數某一為1的位有價值,則該魔石被選。

#include#define far(i,s,n) for(int i=s;ib.magic;

}}a[2000];

void insert(ll x,int &flag)

x ^= b[i];}}

}int main()

coutsolution:套上面第k大模板即可,注意每組案例重置b、nb、flag、tot為0

#include#define far(i,s,n) for(int i=s;i= 0; i--)

x ^= b[i];}}

flag = true;

}ll rebuild()

}for(int i = 0; i <= 62; i++)

}ll kth_max(ll k)

return res;

}int main()

rebuild();

int q;

scanf("%d",&q);

far(i,0,q)

}}

線性基求交

學習了 感覺線性代數的性質還是很奇妙呀 給定兩個線性空間,或者是兩個基 b 1,b 2 求兩個線性空間的交 來個引理 令 w v 1 cap b 2 若 b 1 cup b 2 setminus w 線性無關,那麼 w 是 v 1 cap v 2 的一組基 首先 w 張成的線性空間不會比 v 1 c...

線性基求交與求並

先說明一下這裡的求交與求並分別是什麼意思。就是有兩個線性空間v 1v 1 v1 與v 2v 2 v2 求出這兩個空間的交與並。當然oi中的線性空間大部分是指異或操作下的,也就是常說的線性基。如下所說的,都是異或的線性基,不區分加號與異或,即 xi x1 x2.x3 sum x i x 1 oplus...

P3812 模板 線性基 求最大值)

這是一道模板題。給定n個整數 數字可能重複 求在這些數中選取任意個,使得他們的異或和最大。輸入格式 第一行乙個數n,表示元素個數 接下來一行n個數 輸出格式 僅一行,表示答案。輸入樣例 1 複製 2 1 1 輸出樣例 1 複製 1 1 n 50,0 si 250 1 leq n leq 50,0 l...