除了xor_b不存在異或為0的結果外,xor_a和xor_b可以說是相等的。
結果是相同的,但壓縮了空間,除此外線性基還有很多比較方便的性質。(到題目裡細講)
講的不是很嚴謹,大意是這樣。
更詳細可以看這裡:線性基模板以及講解然後開始刷題。
1.bzoj2460
題意:給n塊石頭,石頭有兩個屬性標號id和魔法值v,選取任意數量的石頭,這些石頭的編號子集異或不能為0,並且使魔法值的和最大。
首先線性基里的元素互相異或不等於0。
當乙個元素嘗試插入線性基時,要出來被異或成0(插入失敗),否則就插入成功。
所以這個題我們先插入魔法值v最大的石頭。
#include
using namespace std;
typedef
long
long ll;
const
int n=
1e5+
100;
struct nodea[n];
bool cmp
(node x,node y)
ll b[63]
; bool insert
(ll x)
else x^
=b[i];}
}return x;
}int
main()
2.牛客練習賽49e
求線性基里元素個數的奇偶性就行。
#include
using namespace std;
typedef
long
long ll;
ll b[63]
; bool insert
(ll x)
else x^
=b[i];}
}return x;
}int
main()
if(flag)cout<<
"first\n"
;else cout<<
"second\n"
;}
3.hdu 3949求異或第k小#include
typedef
long
long ll;
using namespace std;
ll b[63]
,c[63
],cnt,
;bool insert
(ll x)
else x^
=b[i];}
}return x;
}void
rebuild()
ll query_k
(ll k)
intmain()
rebuild()
; cin>>q;
while
(q--)}
}
最後附上一波**模板
#include
typedef
long
long ll;
using namespace std;
ll b[63]
,c[63
],cnt;
ll q_max()
ll q_min()
bool insert
(ll x)
else x^
=b[i];}
}return x;
}void
merge()
void
rebuild()
ll query_k
(ll k)
線性基學習
線性基是乙個數的集合,並且每個序列都擁有至少乙個線性基,取線性基中若干個數異或起來可以得到原序列中的任何乙個數。原序列裡面的任意乙個數都可以由線性基裡面的一些數異或得到 線性基裡面的任意一些數異或起來都不能得到 0 線性基裡面的數的個數唯一,並且在保持性質一的前提下,數的個數是最少的 線性基中每個元...
線性基學習筆記
線性基是幹嘛的呢?給定n個數,求所有數的異或和最大是多少?求解這類問題的時候,就需要線性基了 個人感覺線性基本身就一種貪心。首先定義ba se i bas e i 表示最高位1在i位的數是什麼 對於新進來的數tm p tmp 我們先找出他最高位上的1,假設為第 j j 位,然後看一下ba se j ...
線性基入門學習
前置技能點 線性相關,線性無關 張成 spa nspan span s ss的所有子集 包括空集 的異或和組成的集合,叫做集合s ss的張成。什麼是線性基 線性基可以理解為集合s ss在異或運算中的壓縮,即集合s ss的線性基中的元素進行異或運算可以表示出集合中的元素進行異或運算的所有結果。換句話說...