P4462 CQOI2018 異或序列

2022-07-07 05:00:11 字數 1295 閱讀 6074

求出異或字首和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)

#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;

}

view code

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 開個桶,莫隊即可 注意一下莫隊處理時刪除乙個數時的順序就好了...