8:00–8:05 读题。
8:05–8:30 T1,感觉可以DP什么的,但不知道怎么下手。莫名想到边分治,维护各子树还有多少点没连边什么的,不过显然是错的。直觉告诉我这玩意单纯用树形DP做不了。
8:30–9:00 T2,感觉部分分也是可以DP的。直接维护和和积貌似不太行,应该可以用其他方式DP。
9:00–9:30 T3,肉眼可见, 50pts是好拿的。
n
≤
3000
n\leq 3000
n≤3000 模拟。
t
y
p
e
<
=
2
type<=2
type<=2 线段树。随机估计是和括号数量有关。
9:30–10:00 T3,写
n
≤
3000
n\leq 3000
n≤3000 ,可以用栈线性搞,不过要分讨太麻烦了干脆直接递归dfs。
10:00–10:25 T3,写
t
y
p
e
≤
2
type\leq2
type≤2 ,写了一半发现是个假的 (悲) 。
10:25–10:50 T3,换个状态就可以了,
t
y
p
e
≤
2
type\leq 2
type≤2 拿到了。
10:50–11:10 回头看了一眼 T1、T2,不禁头疼。还是先做T3吧。
11:10–12:00 T3,对大样例打了个表,发现深度是
l
o
g
log
log 的,显然可以建括号树然后分别维护线段树,不过这样搞的话码量太大了还难调试实在糟心,发现区间大小也是
l
o
g
log
log 的,于是更新的时候直接仿照
n
≤
3000
n\leq3000
n≤3000 模拟暴算就可以了,写的好看一点应该能过。
12:00–12:30 检查了检查T3有没有什么sb错误,算了算内存。对着T1、T2发呆。
赛后:
T1 的暴力因为带了个小log外加常熟大竟然T掉了,非常淦。
T1: 人均 20pts 的部分分我只拿了 5pts ,倍增lca真的慢,实际上只要预处理一下去掉一个 log 就可以了。还是要多验证暴力的时间复杂度。
T2: 比赛脑子抽了只写了一个dfs不知道为什么。对于和的部分可以无脑DP,对于积有个巧妙的思路是,分离贡献,分别考虑每个质因子幂的贡献,这玩意的方案数显然只与数列里每个数对于这个质因子的最高指数有关,搞一个 “至少…” 的容斥DP,钦定一下非常好算,这样就有 48pts 了!!!直接求和或积不好求时,可以枚举结果或者过程量分别计算贡献,特别的对于和乘机、因子有关的可以考虑枚举质因子、钦定指数等计算贡献,就变成了出现多少次、有多少满足条件之类的方案数问题。在对指数进行DP时,注意取模应对 mod 取模还是对 mod-1(
ϕ
(
m
o
d
)
\phi(mod)
ϕ(mod)) 取模。
T3: 其实想到随机部分分怎么做就离正解很接近了,瓶颈在于深度不是 log ,由于每次是从某个点到根的一条链,可以考虑树剖对链操作加速,那么答案就被拆分成重链上和轻链间,分别维护即可,不过这样直接做非常糟心。分析性质,可以将多叉树转为二叉树,那么每个结点只有一个重儿子和一个轻儿子,用几个分讨就可以替代重工业。对于链加速可以考虑树剖,维护时考虑将答案拆分为重链和轻链两部分。分析性质,多叉转二叉。