bzoj5301 異或序列(莫隊演算法)

2021-10-05 11:18:54 字數 1257 閱讀 2850

題目鏈結

description

已知乙個長度為 n 的整數數列 a[1],a[2],…,a[n] ,給定查詢引數 l、r ,問在 [l,r] 區間內,有多少連續子段滿足異或和等於 k 。也就是說,對於所有的 x,y (l≤x≤y≤r),能夠滿足a[x]a[x+1]…^a[y]=k的x,y有多少組。

input

輸入第一行,為3個整數n,m,k。

第二行為空格分開的n個整數,即a1,a2,….an。

接下來m行,每行兩個整數l、r,表示一次查詢。

output

輸出檔案共m行,對應每個查詢的計算結果。

sample input

4 5 1

1 2 3 1

1 41 3

2 32 4

4 4sample output42

121hint

1≤n,m≤105,0≤k,a[i]≤105,1≤l≤r≤n

思路:由於本人並不會用樹狀陣列或線段樹做這題,所以這裡用了莫隊,我們考慮一下對於乙個結果sum【l】&sum【r】==k來說(sum陣列是異或字首和),以下等式:sum【r】==k&sum【l】肯定是成立的,於是我們對於位置r來說,能產生貢獻的區間的個數就是字首和為k&sum【r】的個數,我們用num陣列來記錄每個異或字首和的個數,剩下的就是乙個標準的莫隊模板操作了。

#include

using

namespace std;

const

int maxn=

2e6+5;

typedef

long

long ll;

struct cxks[maxn]

;ll k,a[maxn]

,sum[maxn]

,res,ans[maxn]

,num[maxn]

;bool

cmp(

const cxk &a,

const cxk &b)

intmain()

sort

(s+1

,s+1

+m,cmp)

;int l=

1,r=0;

for(

int i=

1;i<=m;

++i)

for(

int i=

1;i<=m;

++i)

printf

("%lld\n"

,ans[i]);

}

bzo5301 Cqoi2018 異或序列 莫隊

已知乙個長度為 n 的整數數列 a 1 a 2 a n 給定查詢引數 l r 問在 l,r 區間內,有多少連續子 序列滿足異或和等於 k 也就是說,對於所有的 x,y l x y r 能夠滿足a x a x 1 a y k的x,y有多少組。1 n,m 105,o k,ai 105,1 lj rj n...

BZOJ5301 Cqoi2018 異或序列

bzoj5301 cqoi2018 異或序列 已知乙個長度為 n 的整數數列 a 1 a 2 a n 給定查詢引數 l r 問在 l,r 區間內,有多少連續子串行滿足異或和等於 k 也就是說,對於所有的 x,y l x y r 能夠滿足a x a x 1 a y k的x,y有多少組。輸入檔案第一行,...

洛谷P4462 異或序列 (莫隊)

2020.5.21 這道題,講真,最難的部分在於怎麼將轉移在常數時間內算出,然而看到題目的字首和我就在紙上推了推,異或滿 換律和字首和的定義,所以就把a陣列轉化成字首和的形式就行了,然後和k異或就能獲得目標值,因為是字首和,所以一定代表子串行,那麼就簡單了。然而我發現了個問題,莫隊跑出來結果貌似不對...