求出異或字首和sum,對於 a[ l ] ^ a[ l + 1] ^ .... ^ a[ r ] 就變成了sum[ r ] ^ sum[ l - 1 ],所以最終我們要求的就是在區間 [ l,r ] 中有多少子區間 [ l,r ] 是滿足 sum[ r ] ^ sum[ l - 1 ] = k 的(sum[ r ] ^ sum[ l - 1 ] = k 《==》sum[ l - 1 ] = sum[ r ] ^ k 《==》sum[ r ] = k ^ sum[ l - 1 ]),變換以下就是求 [ l - 1,r ] 區間有多少個數是等於k ^ sum[ x ] (ps:x 是當前區間中新加入的數)
因此題目就變成了區間記數問題,而題目中可以離線處理,所以我們就可以用莫隊來寫。
#include#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)view code#define _for(i,s,t) for(int i=s;i#define _rof(i,s,t) for(int i=s;i>t;i--)
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define per(i,s,t) for(int i=s;i>=t;i--)
#define ri(x) scanf("%d",&x)
#define rii(x,y) scanf("%d%d",&x,&y)
#define inf 0x3f3f3f3f
using
namespace
std;
template
inline void read(t &res)
typedef
long
long
ll;const
int maxn = 1e5 + 10
;int
a[maxn],ans[maxn],cnt[maxn],block;
struct
node
}nd[maxn];
intmain()
rep(i,
1,m)
sort(nd + 1,nd + 1 +m);
int l = 1,r = 0,num = 0
; rep(i,
1,m)
while(r >nd[i].r)
while(l
while(l >nd[i].l)
ans[nd[i].i] =num;
}rep(i,
1,n)
return0;
}
P4462 CQOI2018 異或序列
原題鏈結 給你乙個長度為 n 的序列和 m 次詢問,求每次詢問中有多少個子區間異或和為 k 這是一道區間查詢的題目,所用的演算法是資料結構,我這裡用的是莫隊演算法 回顧一下異或的神奇性質 1.a b c 則 a c b b c a 2.a a 0 a 0 a 則 a a a a 有了上面的性質,我們...
P4462 CQOI2018 異或序列 莫隊
區間異或 sum l,r pr e l 1 xo rpre r sum l,r pre l 1 xor pre r sum l,r p re l 1 x orpr e r a xo rb k axo rk b a xor b k implies a xor k b axorb k ax ork b ...
LuoguP4462 CQOI2018 異或序列
鏈結 異或的逆運算就是其本身 即a xor b c 即 c xor a b 對於本題,記錄一下1 i的異或和為sum i 顯然l r的異或和就為sum l 1 xor sum r 若為異或和為k即滿足sum r xor k sum l 1 開個桶,莫隊即可 注意一下莫隊處理時刪除乙個數時的順序就好了...