前置技能點:線性相關,線性無關
張成 (spa
nspan
span
): s
ss的所有子集(包括空集)的異或和組成的集合,叫做集合s
ss的張成。
什麼是線性基
線性基可以理解為集合s
ss在異或運算中的壓縮,即集合s
ss的線性基中的元素進行異或運算可以表示出集合中的元素進行異或運算的所有結果。
換句話說,如果是通過集合a構造出來的線性基,那必然可以通過若干線性基中元素的異或組合構成 若干由集合中的元素構成的異或組合.但是線性基中的元素數量是要遠遠小於的集合中元素的數量的.
其中線性基中的數量最多是元素的二進位制的最大位數,如果是64位整數,那麼最多只有64個線性基元素,
線性基條件
若集合b
bb是集合s
ss的線性基
1.集合b是線性無關的。構建方法的特點2.集合s∈s
pan(
b)
s\in span(b)
s∈span
(b) 。
時間複雜度64∗n
+642
64*n+64^2
64∗n+6
42:ai=
0a_i=0
ai=0,
並且只有滿足 j
>
ij>i
j>i的a
ja_j
aj的第i
ii個二進位制位可能為 1
11;(j
jj是高位)
a i!
=0
a_i != 0
ai!=0
,並且整個a
aa陣列中只有a
ia_i
ai的i
ii 個二進位制位為 111;
a
ia_i
ai更高的二進位制位( >
i>i
>
i的二進位制位)一定為0
00 ;
a
ia_i
ai更低的二進位制位( <
i<
i的二進位制位)可能為 111;
各個樣例體會一下:**抄至大佬:212 15
const
int maxl =63;
struct linearbasis
linearbasis
(long
long
*x,int n)
void
insert
(long
long t)}}
// 陣列 x 表示集合 s,下標範圍 [1...n]
void
build
(long
long
*x,int n)
}long
long
querymax()
void
mergefrom
(const linearbasis &other)
static linearbasis merge
(const linearbasis &a,
const linearbasis &b)
};
還有一種構造方法:
ll p[
105]
, a[
105]
;int n;
void
guass_base()
a[i]
^= p[j];}
}}
線性基入門
線性基真的是乙個非常神奇的演算法。它可以用於求解乙個集合內的最大異或和,而且效率極高,是 o n log maxnum 的時間複雜度。所以,它還是十分值得一學的。什麼是線性基?對於乙個陣列 a 1a 2.a n 我們可以用 num 1num 2.num 來記錄第乙個二進位制下最高位出現在第 i 位的...
線性基入門
線性基是乙個集合 也就是說線性基是對原集合的壓縮 首先,可以知道 對於集合a 將其中的ai i 1,n 用ai aj j 1,n 且j i 替換得到集合b 從集合a中選取任意多個數異或得到的值都能通過在集合b中選取一些數進行異或得到 證 從原集合a中選取一些數異或得到 x ak1 ak2 akm k...
線性基學習
除了xor b不存在異或為0的結果外,xor a和xor b可以說是相等的。結果是相同的,但壓縮了空間,除此外線性基還有很多比較方便的性質。到題目裡細講 講的不是很嚴謹,大意是這樣。更詳細可以看這裡 線性基模板以及講解然後開始刷題。1.bzoj2460 題意 給n塊石頭,石頭有兩個屬性標號id和魔法...