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