LuoguP4735最大異或和(可持久化Trie)

2022-09-12 10:45:18 字數 1259 閱讀 7011

題目傳送門

給乙個序列\(\\),長度為n.

有m個操作.

1.在序列末尾新增乙個x.

2.找到乙個\(p∈[l,r]\),使得\(a[p]⊕a[p+1]⊕...⊕a[n]⊕x\)最大,其中n為序列的長度。

記\(all\)為\(a[1]⊕a[2]⊕a[3]...⊕a[n]\)

詢問即為找到乙個\(p∈[l,r]\) 使得\(a[1]⊕a[2]⊕a[3]...⊕a[p]⊕all⊕x\)最大。

所以,我們只需要維護序列\(\\)的字首異或和即可。

這裡引出了乙個演算法:

可持久化trie

聽起來十分高大上。

其實就是用一顆01trie維護每一位的出現次數。

和可持久化主席樹的實現差不多。

網上的板子都過於優秀(神仙)

受到右邊大佬啟發後,開始研究如何像寫主席樹一樣寫可持久化trie.

個人感覺很好理解。

#include using namespace std;

#define debug(...) fprintf(stderr, __va_args__)

#define mp make_pair

#define fst first

#define snd second

templateinline bool chkmin(t &a, const t &b)

templateinline bool chkmax(t &a, const t &b)

inline int read()

typedef long long ll;

typedef pairpii;

int inf = (1 << 25) - 1;

const int maxn = 3e5 + 10, log = 25;

struct sgttre[maxn << 6];

int cnt, p[maxn << 1], pow[30], root[maxn << 1];

void build(int &rt, int grt,int pos, int t)

int query(int a, int b, int pos, int t)

void init(int n)

}int main()

else

} return 0;

}

Luogu P4735 最大異或和

題目 建可持久化01trie。每次建乙個新版本把序列的每個字首和插進去。新增操作亦如此。查詢的話就看每個數字取反的一側在01trie的這個區間內是否出現過 也就是 sum 是否相等 然後跳兒子。這裡蘊含了高位貪心的思想。includeusing namespace std const int n 3...

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,...