A
显然按照
d
e
p
−
s
i
z
dep-siz
dep−siz排序后贪心
代码就不放了
B
显然枚举一个另外两个是最近的
代码就不放了
C
设
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示已经和
T
T
T匹配了
i
i
i个,用了
S
S
S中
j
,
j
+
i
−
1
j,j+i-1
j,j+i−1的方案数
显然每次要么
S
S
S往左或右拓展一位
D
考虑如果某个数不是
0
0
0个,那么插入一个后一定可以通过碰的个数确定这个数有几个
如果插入一个
i
i
i后
顺子的变化量是
a
[
i
+
2
]
∗
a
[
i
+
1
]
+
a
[
i
+
1
]
∗
a
[
i
−
1
]
+
a
[
i
−
1
]
∗
a
[
i
−
2
]
a[i+2]*a[i+1]+a[i+1]*a[i-1]+a[i-1]*a[i-2]
a[i+2]∗a[i+1]+a[i+1]∗a[i−1]+a[i−1]∗a[i−2]
考虑这样询问
n
−
1....4
,
3
,
1
,
2
,
1
n-1....4,3,1,2,1
n−1....4,3,1,2,1
由于一插入了两次,所以可以确定
1
1
1的个数
然后考虑插入两次
1
1
1顺子的变化
分别是
(
a
3
+
1
)
∗
a
2
和
(
a
3
+
1
)
∗
(
a
2
+
1
)
(a_3+1)*a_2和(a_3+1)*(a_2+1)
(a3+1)∗a2和(a3+1)∗(a2+1)
相减可以得到
a
3
a_3
a3,然后得到
a
2
a_2
a2
然后利用插入
i
−
2
i-2
i−2时顺子变化量就可以得到
a
i
a_i
ai
这样就不用插入
a
n
a_n
an了
主要就是利用边界来优化获得信息
E1
考虑建出线性基
如果大小为
k
k
k
显然剩下
n
−
k
n-k
n−k个数怎么选都对应线性基的一种选法得到某个特定的数
所以最后方案乘一个
2
n
−
k
2^{n-k}
2n−k
然后考虑线性基内组成的数
对于前后
m
/
2
m/2
m/2的所有基分别爆搜出所有可以组成的数
于是两边的某
i
,
j
i,j
i,j组合的位数就是
i
前
17
位
的
位
数
+
(
i
后
17
位
⊕
j
的
位
数
)
i前17位的位数+(i后17位\oplus j的位数)
i前17位的位数+(i后17位⊕j的位数)
枚举高位的位数,然后
f
w
t
fwt
fwt优化即可
E2
考虑设线性基中所有可以组成的数的集合为
S
S
S
设
f
i
=
[
i
∈
S
]
,
g
c
,
i
=
[
p
o
p
c
o
u
n
t
(
i
)
=
c
]
f_i=[i\in S],g_{c,i}=[popcount(i)=c]
fi=[i∈S],gc,i=[popcount(i)=c]
那么有
c
c
c位的答案就是
(
f
∗
g
c
)
[
0
]
∗
2
n
−
k
(f*g_c)[0]*2^{n-k}
(f∗gc)[0]∗2n−k,
∗
*
∗为异或卷积
(
f
∗
g
c
)
[
0
]
(f*g_c)[0]
(f∗gc)[0]就是
f
,
g
c
f,g_{c}
f,gc转点值之后对应位乘起来的和
考虑分别优化
先考虑
g
c
g_c
gc,显然对于
p
o
p
c
o
u
n
t
popcount
popcount相同的
i
i
i,
f
w
t
fwt
fwt之后的值相同
考虑
f
w
t
fwt
fwt意义,
g
^
c
,
i
=
∑
j
,
p
o
p
c
o
u
n
t
(
j
)
=
c
(
−
1
)
∣
j
&
i
∣
\hat{g}_{c,i}=\sum_{j,popcount(j)=c}(-1)^{|j\&i|}
g^c,i=∑j,popcount(j)=c(−1)∣j&i∣
那么
g
^
c
,
x
(
p
o
p
c
o
u
n
t
(
x
)
=
i
)
=
∑
j
=
0
m
(
i
j
)
(
m
−
i
c
−
j
)
(
−
1
)
j
\hat{g}_{c,x}(popcount(x)=i)=\sum_{j=0}^m{i\choose j}{m-i\choose c-j}(-1)^j
g^c,x(popcount(x)=i)=∑j=0m(ji)(c−jm−i)(−1)j
于是所有可以在 O ( m 3 ) O(m^3) O(m3)内求出
现在考虑 f ^ \hat{f} f^中 p o p c o u n t popcount popcount每一个的值
首先根据线性基的封闭性显然有
f
∗
f
=
f
∗
2
k
,
f
^
∗
f
^
=
f
^
∗
2
k
f*f=f*2^k,\hat{f}*\hat{f}=\hat{f}*2^k
f∗f=f∗2k,f^∗f^=f^∗2k
所以
f
^
\hat{f}
f^每一位要么为
0
,
0,
0,要么为
2
k
2^k
2k
那么可以得到
f
^
i
为
2
k
\hat{f}_i为2^k
f^i为2k当且仅当和
S
S
S所有数的交的
p
o
p
c
o
u
n
t
popcount
popcount都为偶数
证明考虑如果有一个交为奇数,那么系数为负,显然权值和不可能得到
2
k
2^k
2k
再考虑若 ∣ i & x ∣ , ∣ j & x ∣ |i\&x|,|j\&x| ∣i&x∣,∣j&x∣为偶数,那么有 ∣ ( i ⊕ j ) & x ∣ |(i\oplus j)\&x| ∣(i⊕j)&x∣为偶数
所以需要的只是和所有基的交 p o p c o u n t popcount popcount为偶数
考虑线性基的矩阵形式
将主元所在的
k
k
k列提到前面取,显然前面
k
∗
k
k*k
k∗k是一个单位矩阵
后面
k
∗
(
m
−
k
)
k*(m-k)
k∗(m−k)是乱的
而考虑如果对于后面 ( m − k ) (m-k) (m−k)列的位任意为 0 / 1 0/1 0/1,那么和每一个基这 m − k m-k m−k位的交位数决定了这个基对应前面的那位是 0 0 0还是 1 1 1
所以可以得到
f
^
\hat{f}
f^中有值的个数只有
2
m
−
k
2^{m-k}
2m−k个
爆搜出来即可
这样就可以做到
2
m
2
2^{\frac m 2}
22m了
对于
k
k
k小的情况直接爆搜线性基即可得到答案
这样复杂度是 O ( n + m 3 + 2 m 2 ) O(n+m^3+2^{\frac m 2}) O(n+m3+22m)的
F
考虑按照 l c a lca lca是否相同讨论
首先是不同的情况
对于路径
(
E
,
F
)
,
(
G
,
H
)
(E,F),(G,H)
(E,F),(G,H)
考虑
B
B
B时,将两条路径往下
k
k
k步的点
C
,
D
C,D
C,D子树加
然后在
A
A
A时询问两个端点
E
,
F
E,F
E,F的值即可
树状数组维护即可
对于相同的再分两种情况
首先是路径的并没有完全的包含住
L
c
a
Lca
Lca,即
l
c
a
lca
lca在路径并的端点上
对于路径
(
A
,
E
)
,
(
C
,
D
)
(A,E),(C,D)
(A,E),(C,D)
只需要类似的在
l
c
a
lca
lca往下
k
k
k步的子树加单点求和即可
但是注意为了不算重可以按照
d
f
s
dfs
dfs顺序只加一个询问另一个
剩下是整个包含
l
c
a
lca
lca的情况
(
B
,
E
)
,
(
C
,
F
)
(B,E),(C,F)
(B,E),(C,F)
对于路径
(
u
,
v
)
(u,v)
(u,v)
对每个点
u
u
u维护一个线段树,维护
d
f
s
dfs
dfs上所有
v
v
v
然后考虑往上合并,
在两个
u
1
,
u
2
u_1,u_2
u1,u2的
l
c
a
′
lca'
lca′处,
找到往
L
c
a
Lca
Lca再往
v
1
v_1
v1走
k
k
k步的位置,询问子树中有多少个
v
v
v
即对于所有合法
v
2
v_2
v2
合并的过程可以用启发式合并+线段树合并
可以对于所有的
u
u
u建出一颗虚树再
d
f
s
dfs
dfs
或者考虑重剖,求
d
f
s
dfs
dfs序的时候先走轻儿子再走重儿子
然后对于每个路径满足
i
n
[
u
]
<
i
n
[
v
]
in[u]<in[v]
in[u]<in[v]
这样一定不会有
u
u
u在当前
l
c
a
lca
lca的重儿子内
所以只用
d
f
s
dfs
dfs自己轻儿子的整个子树
考虑复杂度一个点只会对所有轻边的父亲贡献
所以
d
f
s
dfs
dfs所有点的复杂度是
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)的
复杂度 O ( m l o g 2 n ) O(mlog^2n) O(mlog2n)