P4462 CQOI2018 異或序列 莫隊

2021-10-24 04:47:39 字數 3179 閱讀 4024

區間異或: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 區間 n

2n^2

n2優化區別:以前只是區間 [l,

r]

[l,r]

[l,r

] 判斷 a

ia_i

ai​ 和 a

ja_j

aj​ 的合法方案數,這次是ai−

1a_

ai−1​和a

ja_j

aj​的方案數

只需要針對 l

ll 的時候,提前減一即可。其實計算的是:sum

[l−1

,r

]sum[l-1,r]

sum[l−

1,r]

,但是不包括 i==

ji==j

i==j

的方案數,在add or del的時候,注意順序

上莫隊,注意 a

ia_i

ai​ 的範圍,axo

rb

<=a

+b

a\;xor\;b<=a+b

axor

b<=a

+b

//#pragma comment(linker,"/stack:1024000000,1024000000")

//#pragma gcc optimize(2)

//#pragma gcc target ("sse4")

#include

//typedef long long ll;

#define ull unsigned long long

//#define int __int128

#define int long long

#define f first

#define s second

#define endl "\n"

//<#define eps 1e-6

#define base 131

#define lowbit(x) (x&(-x))

#define db double

#define pi acos(-1.0)

#define inf 0x3f3f3f3f

#define maxn 0x7fffffff

#define inf 0x3f3f3f3f3f3f3f3f

#define _for(i, x, y) for (int i = x; i <= y; i++)

#define for_(i, x, y) for (int i = x; i >= y; i--)

#define ferma(a,b) pow(a,b-2)

#define mod(x) (x%mod+mod)%mod

#define pb push_back

#define decimal(x) cout << fixed << setprecision(x);

#define all(x) x.begin(),x.end()

#define rall(x) x.rbegin(),x.rend()

#define memset(a,b) memset(a,b,sizeof(a));

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

using

namespace std;

#ifndef online_judge

#include

"local.h"

#endif

template

<

typename t>

inline t fetch()

template

<

typename t>

inline vector

fetch_vec

(int sz)

template

<

typename t>

inline

void

makeunique

(vector

& v)

template

<

typename t>

inline t max_

(t a,t b)

template

<

typename t>

inline t min_

(t a,t b)

void

file()

void

match()

const

int n=

1e5+5;

const

int m=

5e6+5;

struct node

}s[n]

;int a[n]

,cnt[m]

,ans[n]

,now=

0,pre[n]

;int n,m,k;

void

add(

int x)

void

del(

int x)

signed

main()

sort

(s,s+m)

;int l=

1,r=0;

for(

int i=

0;i)for

(int i=

0;i) cout<

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

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