P4735 最大異或和

2022-05-21 04:16:37 字數 1269 閱讀 7857

點我跳轉

給定乙個非負整數序列 \(a\),初始長度為 \(n\)。

有 \(m\) 個操作,有以下兩種操作型別:

1、」\(a\)

\(x\)」:新增操作,表示在序列末尾新增乙個數 \(x\),序列的長度 \(n\) 增大 \(1\)。

2、」\(q\)

\(l\)

\(r\)

\(x\)」:詢問操作,你需要找到乙個位置 \(p\),滿足 \(l≤p≤r\),使得:\(a_p\) xor \(a_\) xor \(…\) xor \(a_n\) xor \(x\) 最大,輸出這個最大值。

記錄 \(sum_i\) 為前 \(i\) 個數的字首和,那麼 \(a_p\) xor \(a_\) xor \(…\) xor \(a_n\) xor \(x\) = \(sum_\) xor \(sum_n\) xor \(x\)

其中 \(sum_n\) xor \(x\) 是固定的,那麼題目就可以轉換為在區間 \([l , r]\) 中找到乙個 \(p\) 使得 \(sum_\) xor (\(sum_n\) xor \(x\)) 最大

即在區間 \([l-1,r-1]\) 找到乙個 \(p\) 使得 \(sum_\) xor (\(sum_n\) xor \(x\)) 最大

然後就是跑可持久化01trie了

注意特判點 → 當 \(r = 1\) 時,\(r - 1\) 為 \(0\) ,\(root[r- 1] = root[0] = 0\) ,故 \(root[r - 1]\) 的指標無法在字典樹上跳動,所以需要特判一下

#includeusing namespace std;

const int n = 1e6 + 10;

int n , m , tot;

int a[n] , sum[n] , cnt[n * 31] , root[n] , tree[n * 31][2];

void insert(int id , int s) }

int query(int l , int r , int s)

else p = tree[p][x] , q = tree[q][x];

} return res;

}signed main()

else

cout << query(l - 1 , r - 1 , sum[n] ^ x) << '\n';

} }return 0;

}

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

P4735 最大異或和

p4735 最大異或和 可持久化trie 據n n 0,我們可以把問題轉化為字首異或和 設為s i 也就是求 s n s p 的最大值 顯然,這是經典的trie上貪心問題。但是詢問次數過多,我們總不能每次都建一棵完整的樹。注意到,對於每次詢問我們所需的trie都只有很小的不同。於是我們就可以用可持久...