题意简述
求
∑
1
≤
L
≤
R
≤
n
⨁
L
≤
l
≤
r
≤
R
⨂
l
≤
x
≤
r
A
x
,
n
≤
2
∗
1
0
5
\sum_{1\leq L\leq R\leq n}\bigoplus_{L\leq l\leq r\leq R}\bigotimes_{l\leq x\leq r}{A_x},n\leq 2*10^5
∑1≤L≤R≤n⨁L≤l≤r≤R⨂l≤x≤rAx,n≤2∗105
⨁
\bigoplus
⨁是异或,
⨂
\bigotimes
⨂是或。
题解
10%
按照题意模拟即可, O ( n 5 ) O(n^5) O(n5)
40%
记
S
1
[
l
,
r
]
=
⨂
l
≤
x
≤
r
A
x
,
S
2
[
L
,
R
]
=
⨁
L
≤
l
≤
r
≤
R
S
1
[
l
,
r
]
S_1[l,r]=\bigotimes_{l\leq x\leq r}{A_x},S_2[L,R]=\bigoplus_{L\leq l\leq r\leq R}S_1[l,r]
S1[l,r]=⨂l≤x≤rAx,S2[L,R]=⨁L≤l≤r≤RS1[l,r]。
不难发现可以
O
(
n
2
)
O(n^2)
O(n2)求出所有值。
100%
由于内部是位运算,考虑对于每一位,
⨁
L
≤
l
≤
r
≤
R
⨂
l
≤
x
≤
r
A
x
\bigoplus_{L\leq l\leq r\leq R}\bigotimes_{l\leq x\leq r}{A_x}
⨁L≤l≤r≤R⨂l≤x≤rAx的值为1的
L
,
R
L,R
L,R的个数。
由于有异或,原问题转化为求有多少个子区间,它有奇数个子区间中至少有一个1。
假设已经算完了右端点为
k
−
1
k-1
k−1的区间的贡献,考虑如何计算右端点为
k
k
k的。
假设前
k
k
k个位置中最后一个1的位置为
p
p
p。那么对于
i
>
p
i>p
i>p,
[
i
,
k
]
[i,k]
[i,k]的贡献为0;对于
i
≤
p
i\leq p
i≤p,
[
i
,
k
]
[i,k]
[i,k]的贡献为
[
i
,
k
−
1
]
[i,k-1]
[i,k−1]的贡献加上
p
−
i
+
1
p-i+1
p−i+1以后模二的值。不难发现贡献是否改变只与p、i的奇偶性有关,于是记一下奇/偶位置当前1/0的个数即可。具体实现见代码。
时间复杂度
O
(
n
∗
w
)
,
w
=
20
O(n*w),w=20
O(n∗w),w=20