還以為是什麼非常高大上的東西花了1h不到就學好了
線性基可以在o(n
logx
)o(nlogx)
o(nlog
x)的時間內計算出n
nn個數的最大異或和(不需要相鄰)。
上述中x
xx表示的最大的數。
定義p [i
]p[i]
p[i]
表示在二進位制下從最高位開始第乙個出現1
11的數。
當前我們將乙個數插入線性基中。
如果x
xx的最高位的1
11還沒有被插入過,那麼就在這一位上插入xxx。
如果沒有被插入過,那麼就異或上這一位上的數。
查詢操作:從最高位上開始貪心。
如果異或這一位上的數可以讓答案更大,那麼就異或,否則就異或。
因為我們從高位往低位貪心,所以不需要考慮低位上的數會讓高位上的數變小的情況。
介於我們在插入的時候都是無法匹配的時候,異或上這一位上的數,那麼就保證了我們的這個數能夠達到自己能用的最大貢獻。
【洛谷模板區】
#include
using
namespace std;
const
int bit =63;
const
int n =52;
typedef
long
long ll;
ll a[n]
, p[bit +2]
;int n;
void
ins(ll x)
x ^= p[i];}
}int
main()
線性基學習筆記 模板總結
引入 一組線性無關的向量可以作為一組基底,用這個基底可以表示空間中的全部向量,而且這個基地的個數是確定的,他們線性無關,加入空間中的其他向量之後,就變得線性相關了。線性基 考慮這樣的線性基性質 模擬我們前面關於基的介紹 性質一 首先線性基是如何構造的呢?我們設有乙個陣列d,表示序列a的線性基,下標從...
線性基學習筆記
線性基是幹嘛的呢?給定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...