文章目录
Underground Lab
CodeForces - 781C
考虑
k
=
1
k=1
k=1时,随便找一个生成树,跑欧拉序,点数刚好2n。拓展到一般情况就把欧拉序平分成
k
k
k段
Axel and Marston in Bitland
CodeForces - 781D
先预处理出要用到的矩阵:
P
,
B
,
P
B
,
B
P
,
P
B
B
P
,
B
P
P
B
⋯
P,B,PB,BP,PBBP,BPPB\cdots
P,B,PB,BP,PBBP,BPPB⋯
那么最终路径一定可以按二进制拆分成几段
{
P
⋯
(
2
a
)
}
{
B
⋯
(
2
b
)
}
{
P
⋯
(
2
c
)
}
⋯
\{P\cdots(2^a)\}\{B\cdots(2^b)\}\{ P\cdots(2^c)\}\cdots
{P⋯(2a)}{B⋯(2b)}{P⋯(2c)}⋯,倒着枚举,然后看
a
n
s
⋅
f
[
0
/
1
]
[
i
]
ans \cdot f[0/1][i]
ans⋅f[0/1][i]是否为空矩阵,为空则说明不行
然后发现矩阵乘法可以用bitset优化,复杂度 O ( 61 n 3 w ) ( 61 = l o g 2 1 0 18 ) O(\frac{61n^3}w)(61=log_210^{18}) O(w61n3)(61=log21018)
Fox and Perfect Sets
CodeForces - 388D
把一个集合看成一个线性空间,那么每个集合都对应着一个线性基,而把线性基高斯消元成上三角矩阵后,与所求的集合一一对应(即不会有两个线性基对应同一个集合)
简易证明:若基的个数或某个基的最高位不同,则一定对应不同集合;否则找到第一个不同的基,用另一个线性基的元素无法表示出这个基
所以转化为求有多少个线性基。注意到要满足 m a x ≤ k max\leq k max≤k,而一个消元后的线性基的 m a x max max就是异或和,即满足异或和 ≤ k \leq k ≤k
类似数位dp,设 d p [ i ] [ j ] [ 0 / 1 ] dp[i][j][0/1] dp[i][j][0/1]表示当前在第 i i i位(二进制),有 j j j个基,是否顶着上限
- 没有顶着上限
- 不新增线性基,那么当前这位 0 / 1 0/1 0/1随便选, 2 j 2^j 2j种方案
- 新增线性基,那么其他基当前位为 0 0 0, 1 1 1种方案
- 顶着上限
-
k
k
k这位为
1
1
1
- 让异或和这位为 1 1 1,方案数有 2 j − 1 2^{j-1} 2j−1(后 j − 1 j-1 j−1个任意 0 / 1 0/1 0/1,用第1个控制异或和),特判 j = 0 j=0 j=0时方案为0
- 让异或和这位为 0 0 0,方案数 2 j − 1 2^{j-1} 2j−1,特判 j = 0 j=0 j=0方案为1
- 新增一个基,方案为1
- k k k这位为 0 0 0,那么异或和这位只能为 0 0 0,方案数 2 j − 1 2^{j-1} 2j−1
-
k
k
k这位为
1
1
1
Andryusha and Nervous Barriers
CodeForces - 781E
考虑暴力,用线段树+set维护区间内球的信息,遇到一个屏障时把撞上的球一个一个删掉,再加入两个新的球。复杂度用势能分析,初始有n个球,每个屏障增加2个球,复杂度为
O
(
(
n
+
m
)
l
o
g
2
n
)
O((n+m)log^2n)
O((n+m)log2n)
优化一下,既然是将球一个一个删掉,就没必要把所有球都存起来,用类似链表的方式,每个球指向它上面的球,然后线段树维护区间内最低的球,也是将球一个一个删掉,复杂度 O ( ( n + m ) l o g n ) O((n+m)logn) O((n+m)logn)
Prime Flip
AtCoder - arc080_d
先差分,对于一对关键点
(
i
,
j
)
(i,j)
(i,j)
- j − i j-i j−i为奇质数,则代价为1
- j − i j-i j−i为偶数,由哥德巴赫猜想,代价为2
- j − i j-i j−i为奇合数,则先用3转化为偶数,代价为3
于是有贪心,先用二分图匹配处理第一种情况,然后把同奇偶的用第二种处理,最后如果还剩一堆就用第三种处理