洛谷P4462 異或序列 (莫隊)

2021-10-06 09:11:22 字數 1827 閱讀 8554

2020.5.21

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

然而我發現了個問題,莫隊跑出來結果貌似不對,完蛋,然後只能去看題解,發現l指標的位置如果設定為必須為1,以及詢問需要從l-1開始,emmm,好吧,改了就過了。**如下。

昨天520,看著空間滿屏**,我沒什麼感覺,按現狀,自己可能快有npy了吧,但我沒想好為另乙個人改變自己的現狀是否值得,這是一件值得討論的事情。現階段還是以工作為主吧,加油。

#include

using

namespace std;

#define limit (100000 + 5)

//防止溢位

#define inf 0x3f3f3f3f

#define inf 0x3f3f3f3f3f

#define lowbit(i) i&(-i)

//一步兩步

#define eps 1e-6

#define fastio ios::sync_with_stdio(false);cin.tie(0);

#define ff(a) printf("%lld\n",a );

#define pi(a,b) pair

#define rep(i, a, b) for(int i = a; i <= b ; ++i)

#define per(i, a, b) for(int i = b ; i >= a ; --i)

#define mint(a,b,c) min(min(a,b), c)

#define mod 998244353

#define fopen freopen("c:\\users\\administrator01\\clionprojects\\untitled24\\data.txt", "rt", stdin)

typedef

long

long ll;

typedef

unsigned

long

long ull;

ll read()

while

(s >=

'0'&& s <=

'9')

return x * sign;

}//快讀

void

write

(ll x)

int sum[limit]

, ans[limit]

, a[limit]

,res;

//儲存最近出現的下標

struct node

}query[limit]

;int n, m ,k;

void

add(

int x)

void

del(

int x)

intmain()

int block =

int(

sqrt

(n >=

3? n *

2.0/

3: n));

rep(i ,

1, m)

sort

(query +

1, query +

1+ m)

;int l =

1, r =0;

res =0;

rep(i ,

1, m)

rep(i ,

1, m)

return0;

}

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

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,對於 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 變換以...