線性基總結(模板) BZOJ 2460

2021-09-17 01:37:09 字數 1631 閱讀 9050

**:

線性基概念:線性基的基礎筆記

線性基的應用:線性基是競賽中常用來解決子集異或一類題目的演算法。

所謂線性基,就是線性代數裡面的概念。一組線性無關的向量便可以作為一組基底,張起乙個線性的向量空間,這個基地又稱之為線性基。這個線性基的基底進行線性運算,可以表示向量空間內的所有向量,也即所有向量可以拆成基底的線性組合。

在acm領域,線性基主要用來處理有關異或和的極值問題。根據異或按照二進位制數字進行的方式,我們可以把乙個數字拆成它的二進位制表示形式,而這個二進位制形式拆成一位一位的,可以用向量來表示。顯然,一組線性無關的向量可以張起乙個向量空間,我們同樣可以考慮構造這樣一組數字的二進位制形式組成的線性基。在這個線性基裡面,我可以通過基底的線性組合、異或運算,表示所有的異或結果。

要構造這樣的線性基,首先要滿足乙個性質:任取向量組中兩個向量a、b,把其中乙個替換成a xor b,這組向量線性組合得到的線性空間相同。這個性質對於xor來說是顯然的,因為xor偶數具有抵消性。有了這個性質,就可以利用它對加入的向量進行修改。基本思路是:對於乙個新加入的數字,從最高為考試往後掃,如果某一位該向量是1,但是之前的向量組中沒有乙個這一位是1,那麼這一位就放如這個數字並且break;如果之前已經有該位為1的,那麼該數字異或該位之前對應的數字。最後的結果是,新加入的數字x,要麼被新增到某乙個二進位制位,要麼變成0,說明這個數字對應的二進位制向量不屬於極大線性無關組。

線性基構造完畢,我們就要求其極值。很多時候我們需要求一堆數字最大的異或和,這個時候就要用到線性基。線性基構造完畢之後,根據它的定義,任何線性基所張的向量空間的所有向量都能夠表示為其線性組合。所以我們只需要找,這個線性基中最大的向量即可。做法就是,從高位開始取線性基的每乙個基底,如果異或能夠使得結果變大,那麼就異或。同時,這個還支援有初始值的最大值,因為線性基可以表示所有的向量,所以即使有乙個初始值也是能夠一起計算最大值的。

裡面 1ll的意思是 把int 型別轉化為ll型別 還不理解看這個

#include "iostream"

#include "algorithm"

#include "cstring"

#include "cmath"

#define ll long long

using namespace std;

struct linear_basis

bool ins(ll x)//插入數,x要麼被插入,要麼變成0

ll max(ll x)

ll min(ll x)

// 最小值即為最低位上的線性基

void rebuild()//沒懂 功能是重置

bool ins(ll x)

}return x>0;

}}lb;//線性基結構體

struct nodep[n];

int n;

bool cmp(node a,node b)

int main(int argc, char const *ar**)

sort(p+1,p+1+n,cmp);

for(int i=1;i<=n;i++)

if(lb.ins(p[i].a)/*利用結構體裡面的函式*/) ans+=p[i].b;//如果

printf("%d\n",ans);

} return 0;

}

BZOJ 2460 元素 線性基

input 第一行包含乙個正整數n,表示礦石的種類數。接下來 n行,每行兩個正整數numberi 和 magici,表示這種礦石的元素序號 和魔力值。output 僅包一行,乙個整數 最大的魔力值 sample input 3 1 10 2 20 3 30 sample output 50hint ...

BZOJ 2460 元素 線性基 貪心

線性基是一種特殊的基,它通常會在異或運算中出現,它的意義是 通過原集合s的某乙個最小子集s1使得s1內元素相互異或得到的值域與原集合s相互異或得到的值域相同。性質 線性基能相互異或得到原集合的所有相互異或得到的值。線性基是滿足性質1的最小的集合 線性基沒有異或和為0的子集。題意 n個礦石,第i個礦石...

BZOJ 2460 元素(貪心 線性基)

description 相傳,在遠古時期,位於西方大陸的ma gicl and 上,人們已經掌握了用魔法礦石煉製法杖的技術。那時人們就認識到,乙個法杖的法力取決於使用的礦石。一般地,礦石越多則法力越強,但物極必反 有時,人們為了獲取更強的法力而使用了很多礦石,卻在煉製過程中發現魔法礦石全部消失了,從...