《更新提示》
《第一次更新》
《正文》
小粽是乙個喜歡吃粽子的好孩子。今天她在家裡自己做起了粽子。
小粽面前有 n 種互不相同的粽子餡兒,小粽將它們擺放為了一排,並從左至右編號為 1 到 n。第 i 種餡兒具有乙個非負整數的屬性值 ai。每種餡兒的數量都足夠多,即小粽不 會因為缺少原料而做不出想要的粽子。小粽準備用這些餡兒來做出 k 個粽子。
小粽的做法是:選兩個整數數 l, r,滿足 1 ≤ l ≤ r ≤ n,將編號在[l, r] 範圍內的所有 餡兒混合做成乙個粽子,所得的粽子的美味度為這些粽子的屬性值的異或和。(異或就 是我們常說的 xor 運算,即 c/c++ 中的 ˆ 運算子)
小粽想品嚐不同口味的粽子,因此它不希望用同樣的餡兒的集合做出乙個以上的粽 子。小粽希望她做出的所有粽子的美味度之和最大。請你幫她求出這個值吧!
第一行兩個正整數 n, k,表示餡兒的數量,以及小粽打算做出的粽子的數量。
接下來一行為 n 個非負整數,第 i 個數為 ai,表示第 i 個粽子的屬性值。
對於所有的輸入資料都滿足:1 ≤ n ≤ 5 × 105, 1 ≤ k ≤ min , 0 ≤ ai ≤4, 294, 967, 295。
輸出一行乙個整數,表示小粽可以做出的粽子的美味度之和的最大值。
3 2
1 2 3
6
題目大意:給定乙個長度為\(n\)的序列,求序列異或和最大的\(k\)個子序列的異或值之和。
列舉\(n^2\)個子區間顯然不現實,注意到\(k\)與\(n\)同階,於是想到直接去找那\(k\)個區間。不妨對區間分分類:我們以右端點為分類的依據,將所有子區間分為\(n\)類。顯然,我們可以先處理處每一類區間中異或和最大的乙個,然後取每一類中最大的,這樣在全域性上一定也是最優的。
記三元組\(([x,y],l,r)\)代表右端點\(r\),左端點取值範圍為\([x,y]\)的這一類區間,其中,左端點取\(l\)時異或和最大。這時,我們只需把所有三元組塞進乙個大根堆裡,取異或值最大的就是當前的乙個全域性最優解。
當我們取了乙個目前值最大的區間後,顯然這一類中區間還有其他方案可以選擇,我們不能取完後直接將整個三元組剔除。根據定義,我們可以簡單的將這個三元組分解為另兩個格式相同的三元組\(([x,l-1],l_1,r)\)和\(([l+1,r],l_2,r)\),這樣剛好包含了這類區間中左端點取其他值的情況,又可以加回堆中。
那麼問題就只剩下了給定乙個右端點和左端點的取值範圍,如何快速求最佳的左端點位置,使得區間異或和最大,發現這是可持久化\(0/1trie\)的基本功能。
\(code:\)
#include using namespace std;
const int n = 5e5+20;
struct node ;
int n,k,cnt,root[n],trie[n*33+n][2],latest[n*33+n];
long long ans,a[n],s[n];
inline int read(void)
inline long long readll(void)
void insert(int id,int k,int p,int q)
int c = s[id] >> k & 1;
if ( p != 0 ) trie[q][c^1] = trie[p][c^1];
trie[q][c] = ++cnt;
insert( id , k-1 , trie[p][c] , trie[q][c] );
latest[q] = max( latest[ trie[q][0] ] , latest[ trie[q][1] ] );
}int query(int now,long long val,int k,int lim)
inline void init(void)
}inline void input(void)
inline bool operator < (node p1,node p2)
inline void solve(void)
); }
while ( k-- ));}
l = t.l + 1 , r = t.y;
if ( l <= r ));}
}}int main(void)
《後記》 洛谷P5283 異或粽子 Trie 堆
給出乙個序列,找到m mm個區間 li ri l i,r i li r i 使得這些區間的異或和最大。先做一遍字首異或,這樣問題就被轉換成找m mm對l,r l,rl,r使得 lx or r sum l xor r lxorr 盡量大。注意到a l xor a r a r xor a l a l x...
Trie 可持久化Trie
warning 以下 未經測試,若發現錯誤,歡迎指出qwq 一種簡單的資料結構,可儲存大量字串,可在 o len 的時間內完成插入,刪除,查詢等操作。下面是乙個簡單的例子,對於abc,abd,abcd,bcd這四個字串建trie樹,如下圖 其中,紅色節點為乙個字串的結尾。對於任意節點,從根節點到該節...
可持久化trie
可持久化trie樹 給定乙個非負整數序列,初始長度為n。有m個操作,有以下兩種操作型別 a x 新增操作,表示在序列末尾新增乙個數x,序列的長度n 1。q l r x 詢問操作,你需要找到乙個位置p,滿足l p r,使得 a p a p 1 a n x最大,輸出最大是多少。solution 異或滿足...