最近剛學習了乙個叫線性基的東西.
還是很有意思的.
線性基的性質
線性基有一些很妙的性質.
線性基的構造
插入乙個數\(x\)時,從最高位向最低位掃,如果這一位上線性基為空,那麼就插入.否則就讓\(x\)異或上這一位的數.
線性基求最大值
從高位往低位掃,如果異或上這一位使答案變大,那麼異或.
線性基判斷是否出現
從高位往低位掃,如果\(x\)這一位是\(1\),那麼異或上這一位.
線性基求第\(k\)小值
首先先重構一下線性基.
如果\(i的第\(i\)位是\(1\),那麼讓\(a_j\)異或上\(a_i\).
那麼只有\(a_i\)的第\(i\)位是\(1\),其他都是\(0\).
我們稱重構後的線性基為\(b\)
查詢時,如果\(k\)的第\(i\)位是\(1\),就異或上\(b_i\)
下面是封裝的線性基
struct lb
void insert(ll x)
x^=a[i];
} if(!ins)flag=1;
} ll getmax()
bool exist(ll x)
void rebuild()
ll query_kth(ll k)
}s;
首先來幾道模板題
\(luogu3812\)
\(hdu3969\)
接下來是一道簡單題
\(bzoj2460\)
只要先按\(v\)從大到小排序,然後每次看看是否能插入\(num\),如果可以,答案就加上\(v\)即可.
接下來是一道稍難題
\(bzoj2115\)
詳細題解戳這裡
線性基學習筆記
線性基是幹嘛的呢?給定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...