題解 洛谷P4735最大異或和

2022-02-27 09:43:53 字數 1108 閱讀 6208

學習了一下可持久化trie的有關姿勢~其實還挺好理解的,**也短小精悍。重點在於查詢某個歷史版本的trie樹上的某條邊是否存在,同樣我們轉化到維護字首和來實現。同可持久化線段樹一樣,我們為了節省空間繼承上一節點未修改的資訊,修改的資訊我們則新建一條鏈。節點上我們維護從最初的版本到當前版本這條路徑一共出現了多少次,如果查詢的最後版本記錄這條路徑出現的次數 > 查詢的第乙個版本的上乙個版本的這條路徑出現的次數,則說明這條路徑存在在我們查詢的範圍內。

對於這道題來說,不大好處理的是查詢是一段字尾,而字尾是實時修改的。我們考慮將字尾轉化為字首 :\(x \wedge (a[p] \wedge a[p + 1] ... \wedge a[n]) = x \wedge (a[1] \wedge a[2] ... \wedge a[n] ) \wedge (a[1] \wedge a[2] \wedge ... \wedge a[p - 1])\)。如果將後乙個式子轉化為字首異或的形式的話,我們有原式等於 \(x \wedge s[n] \wedge s[p - 1]\)。\(x \wedge s[n]\) 是乙個定值,所以我們只需要求出一段字首與這個定值的異或和即可。所以我們可以利用可持久化trie樹,查詢對應範圍內的值貪心獲得答案。

#include using

namespace

std;

#define maxn 600100

intn, m, tot, root[maxn];

int cnt[maxn * 28], ch[maxn * 28][2

];int

s[maxn];

intread()

while(c >= '

0' && c <= '

9') x = x * 10 + c - '

0', c =getchar();

return x *k;

}void insert(int now, int pre, int t, int

x)int query(int now, int ath, int t, int

x)int

main()

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

else

}return0;

}

洛谷P4735 最大異或和

電腦從拯救者y7000p 2019換到了m1 air,不想在m1上再折騰一遍hexo,索性就用cnblog了.信誓旦旦的學了可持久化trie和01trie來搞,結果出了一點問題,被卡了好久 先隨便糊了乙個暴力,用pre記一下異或字首和,這麼裸的乙個暴力居然給了73分,11個點wa了3個點,inclu...

P4735 最大異或和

給定乙個非負整數序列,初始長度為n。有m個操作,有以下兩種操作型別 a x 新增操作,表示在序列末尾新增乙個數x,序列的長度n 1。q l r x 詢問操作,你需要找到乙個位置p,滿足l p r,使得 a p a p 1 a n x最大,輸出最大是多少。輸入格式 第一行包含兩個整數 n,m,含義如問...

P4735 最大異或和

題目鏈結 給定乙個非負整數序列,初始長度為n。有m個操作,有以下兩種操作型別 a x 新增操作,表示在序列末尾新增乙個數x,序列的長度n 1。q l r x 詢問操作,你需要找到乙個位置p,滿足l p r,使得 a p a p 1 a n x最大,輸出最大是多少。輸入格式 第一行包含兩個整數n,m,...