BZOJ5301 Cqoi2018 異或序列

2022-03-29 20:05:19 字數 1286 閱讀 4130

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有多少組。

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

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

接下來m行,每行兩個整數lj,rj,表示一次查詢。

1≤n,m≤105,o≤k,ai≤105,1≤lj≤rj≤n

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

4 5 1

1 2 3 1

1 41 3

2 32 4

4 4421

21題解here!

去吧莫隊!

預處理異或字首和,每次莫隊暴力轉移就好。

但是這道題需要注意一下左端點的轉移。

如果原陣列是$val[l]$,字首和陣列是$sum[l]$的話。

因為$val[l]=sum[l]\ xor\ sum[l-1]$,所以我們刪除l的時候,實際上需要刪除的是$l-1$。

剩下的就是莫隊板子了。

據說是$cf$原題?反正我從來不做$cf$題。。。

附**:

#include#include#include#include#define maxn 100010

using namespace std;

int n,m,k,block,s=0;

int val[maxn],sum[maxn],num[maxn],ans[maxn];

struct questionque[maxn];

inline int read()

while(c>='0'&&c<='9')

return date*w;

}inline bool cmp(const question &p,const question &q)

while(que[i].rright)change_add(sum[++right]);

ans[que[i].id]=s;

}for(int i=1;i<=m;i++)printf("%d\n",ans[i]);

}void init()

block=sqrt(n);

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

sort(que+1,que+m+1,cmp);

}int main()

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 異或序列(莫隊演算法)

題目鏈結 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個...

bzoj1257 CQOI 餘數之和

題目 time limit 5 sec memory limit 162 mb submit 2383 solved 1105 submit status discuss 給出正整數n和k,計算j n,k k mod 1 k mod 2 k mod 3 k mod n的值,其中k mod i表示k除...