3.12
T1 Mas的仙人掌:考虑1=[路径上点的个数-路径上边的个数],树链剖分后变成区间赋值,注意要考虑0的情况,要把运算struct起来。
T2 Z的礼物 :用b表示a,斯特林反演一下,用a表示b,倍增求出多项式即可。
T3 Mas和Z玩游戏:Snack Down 2019 Final 原题。枚举最短的原串,根据给出的拼接串的每种长度的数量可以求原串中每种串的数量,从短往长一一还原出原串即可。
3.13
T1 碱基配对:经典的FFT实现字符串匹配例题。
T2 小凯的疑惑 :神仙题,折半再折半,不想写了。
T3 false-false-true :agc原题,随便算算期望。
3.15
T1:最长路加hash判大小。
T2:不会,只能口胡,心态崩了。
T3:不会,只能口胡,心态又崩了,标程上7k。
3.16
T1 计算:对原数跑一遍kmp,以kmp的匹配状态设数位dp随便转移。
T2 移动:随便贪心。
T3 分离:欺诈题,显然到某个值时,答案为0,这个值是96,打表1—95全部答案即可,暴力需优化。
3.18
T1 One?One!:先将s和被除数乘上9,将
x
x
x写成
1
0
d
x
′
+
y
10^dx'+y
10dx′+y的形式,那么
⌊
x
1
0
d
−
1
⌋
\lfloor {x\over {10^d-1}}\rfloor
⌊10d−1x⌋=
x
′
+
⌊
x
′
+
y
1
0
d
−
1
⌋
x'+{\lfloor {{x'+y}\over {10^d-1}}\rfloor}
x′+⌊10d−1x′+y⌋,考虑其意义就是一个位置i上的值会对i-d,i-2d,i-3d等有贡献,用卷积实现,剩下的y是散块由于数据随机,只需保留每个位置开头的前15位数字,散块暴力扫即可,时间复杂度
O
(
n
l
o
g
n
)
O(n\ log\ n)
O(n log n)。
T2 Two?Two! :惨了,我还不会,心态崩了
T3 More?More! :写出生成函数倍增求O(n\ log\ n),TLE了,考虑dp式的两种不同转移,可解得一个二元一次方程,递推求即可。
3.19
T1 全连:随便做做。
T2 原样输出:对所有串建SAM,当发现一个串走不下去时,跳到后面第一个有该位置的值的SAM的根。
T3 不同的缩写:考虑二分答案,对每个串建一个子序列自动机,跑出所有的不超过二分答案上界的所有串,最多只用跑n个出来,来出来做二分图匹配,根据匹配结果来调整二分区间,时间复杂度
O
(
n
3
l
o
g
n
)
O(n^3\ log\ n)
O(n3 log n)。
3.20
T1 河:智商题。可以发现一条河流可以污染的河流在无穷远处是一段连续的一段区间,求出这段区间,
O
(
n
)
d
p
O(n) dp
O(n)dp即可。
T2 铁路:将每条铁路分成上行部分和下行部分,只需考虑上上相交和上下相交,上上相交就是两条铁路在某个点第一次相交,那么这个点一定是lca且两起点深度相同,对每个点维护一颗以深度为下标的的线段树,统计贡献在合并时统计,不会算重。上下相交考虑树链剖分,将每段铁路写成一个深度关于时间的直线,上行的斜率为
−
1
-1
−1,下行的斜率为
1
1
1,答案就是求交点数,将整个坐标系旋转45°,交点数量用个扫描线扫一下就没了。时间复杂度
O
(
n
l
o
g
2
n
)
O(n\ log^2\ n)
O(n log2 n)。
T3 桥:可以发现,每一层的dp都是个下凸函数,用个线段树维护即可。
3.22
T1 方格取数:神仙构造题,不说了。
T2 K君的游戏:设
F
(
x
)
F(x)
F(x)表示答案的
E
G
F
EGF
EGF,可以推出关于
F
(
x
)
F(x)
F(x)的一个方程,这个方程是个常微分方程,我不会解就是了,但我至少会
O
(
n
l
o
g
n
)
O(n\ log\ n)
O(n log n)牛顿迭代求。
T3 礼物:可以发现一个数最多加入一个单调队列,最多被去除出一次单调队列,我们只需要维护一个数后面第一个比它大的数以及一段区间内小于某个特定值的B的个数及乘积,直接上个二维线段树维护即可。时间复杂度
O
(
n
l
o
g
2
n
)
O(n\ log^2\ n)
O(n log2 n)。
3.23
T1 染色问题:每条边用一个二元组(a,b)来描述,表示当两端的节点颜色不同时,答案会乘a,否则会乘b。一开始所有二元组都是(0,1)。度数为1的点可以去掉,度数为2的点可以和它相连的两条边缩成一条边,所后只会剩下最多
10
10
10个点,可以
O
(
B
e
l
l
(
10
)
)
O(Bell(10))
O(Bell(10))暴力枚举集合划分,也可以
O
(
n
2
2
n
)
O(n^22^n)
O(n22n)用集合幂级数来做。
T2 IOer:可以将答案表示成
Σ
i
=
1
m
a
i
1
−
(
v
+
u
i
)
x
\Sigma_{i=1}^m{a_i\over {1-(v+ui)x}}
Σi=1m1−(v+ui)xai,考虑使用式子
(
1
a
−
1
b
)
∗
1
b
−
a
=
1
a
b
({1\over a}-{1\over b})*{1\over b-a}={1\over ab}
(a1−b1)∗b−a1=ab1就可以拆出来了,推推式子就可以求出
a
a
a了。
T3 Deadline:考虑网络流最小割建图,一个时间段拆成左右两个点,左边点表示选0,右边点表示选1,每个点和他可以匹配的任务代表的点连边,考虑一种割边方案,如果一个时间段,连向他的0任务边或连向他的1任务边全被割了,那这个时间段显然可以没有贡献,否则这条时间段代表的边一定会被割,表示这个时间段有任务匹配,综上,最小割便是答案。
3.25
T1 染色问题:写出dp式,然后考虑转移的意义,可以写出生成函数,发现和第一类斯特林数的生成函数差不多,用倍增求解,时间复杂度
O
(
n
l
o
g
n
)
O(n\ log\ n)
O(n log n)。
T2 芬威克树:将
k
k
k写成
k
1
∗
2
k
2
k1*2^{k2}
k1∗2k2,将
x
x
x的最低非零位写成
x
1
∗
2
x
2
x1*2^{x2}
x1∗2x2,可以发现,当
x
2
≥
x
1
x2\geq x1
x2≥x1时,无论怎么变,
x
x
x的最低非零位不会发生变化,变化形式可以写成一条链的形式,我们把修改下放至记录在链头的权值线段树上,若不满足
x
2
≥
x
1
x2\geq x1
x2≥x1我们可以暴力变化,可以发现最多只会变化
O
(
l
o
g
2
k
∗
l
o
g
k
n
=
l
o
g
2
n
)
O(log_2^k*log_k^n=log_2^n)
O(log2k∗logkn=log2n)次,每次暴力修改的结果开个map记录,时间复杂度
O
(
n
l
o
g
2
n
)
O(n\ log^2\ n)
O(n log2 n)。
T3 礼物:用Burnside引理,原题变成求一定长度一定珠子数量的最长连续串不超过k的有标号环数量,考虑容斥枚举有k个不合法的连续串,计算时可以强行固定一个不合法串的开头为1,然后旋转n次,会重复
k次,乘上
n
k
n \over k
kn,时间复杂度
O
(
σ
(
n
)
)
O(\sigma (n))
O(σ(n))。
3.26
T1 完美理论:枚举哪一个点必选,以该点为根建出两棵树,一个点如果选的话,它父亲一定也要选,随便建图跑最小割。
T2 动态半平面交:将
p
k
p^k
pk写成
Π
i
=
1
p
[
i
≤
k
]
\Pi_{i=1}p^{[i\leq k]}
Πi=1p[i≤k],那么就一共有
O
(
n
l
o
g
v
)
O(n\ log\ v)
O(n log v)种不同的可以贡献的数,对点按深度排序,根据深度依次加入这些点,当一个点加入时,只用考虑dfs序跟它相邻的两个点造成的影响,时间复杂度
O
(
n
l
o
g
2
n
)
O(n\ log^2\ n)
O(n log2 n)。
T3 获取名额:对答案式子取自然对数,算出来后再exp回来,对ln泰勒展开45项,发现x和a_i比较接近时展开再多项也会有误差存在,我们可以用rmq查出一段区间内和x的相对误差在某个阈值内的数拿出来单独算贡献,可以发现这样的项一多答案就会趋于0,因此时间复杂度有保证。
3.27
T1 白:先考虑容斥,先求出n阶方阵的特征多项式,求出矩阵
A
A
A的1—m次方,记数组
t
[
i
]
[
j
]
t[i][j]
t[i][j]表示
A
i
A^i
Ai中起点终点编号按位与包含j的方案数,如此递推下去即可,时间复杂度
O
(
n
2
m
+
n
4
)
O(n^2m+n^4)
O(n2m+n4)。
T2 胖:离线。一个点被修改只会影响距离不超过log的点,设
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示
i
i
i对他的子树中距离为j的点的影响,对
f
f
f可持久化,对所有修改对时间整体二分求出每个点第一次变非正的时间。时间复杂度
O
(
q
l
o
g
2
n
)
O(q\ log^2\ n)
O(q log2 n)。
T3 圆:设
f
[
i
]
[
j
]
[
l
]
f[i][j][l]
f[i][j][l]表示构造至当前最大值为i,i与第二个上升子序列末尾的数中有j个数没有加入,第二个上升子序列末尾的数与第三个上升子序列末尾的数有l个数没有加入,用个前缀和优化一下转移变
O
(
1
)
O(1)
O(1),时间复杂度
O
(
n
3
)
O(n^3)
O(n3)。