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