線性基入門學習

2021-09-25 10:04:36 字數 1942 閱讀 7736

前置技能點:線性相關,線性無關

張成 (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和魔法...