abc438
A
简单题
B
简单题
C
用栈维护。
D
dp,设 \(f _ {i, 0/1/2}\) 表示做到第 \(i\) 个,当前取 \(A _ i / B _ i / C _ i\)。注意每种至少要选一个。
E
倍增,设 \(p _ {i, j}\) 为初始在第 \(i\) 个人,走 \(2 ^ j\) 步会到哪里,有 \(p _ {i, j + 1} = p _ {p _ {i, j}, j}\)。
设 \(f _ {i, j}\) 为初始在第 \(i\) 个人,走 \(2 ^ j\) 步获得的水量,有 \(f _ {i, j + 1} = f _ {i, j} + f _ {p _ {i, j}, j}\)。
F
直接拆贡献,一条路径的贡献等于 \(\sum _ {i = 0} ^ {n - 1} [路径是否包含 0 \sim i 号点]\)。
于是枚举 \(0 \le i < n\),则 \(0 \sim i\) 的点的贡献为经过这些点的路径条数。
发现 \(0 \sim i\) 的点必须能被一条链包含否则贡献为 \(0\),可以考虑在树上暴力跳父亲找到第一个访问过的点,同时维护链端点的信息,大力分讨即可做到线性。
G
发现形成了 \(g = \gcd (n, m)\) 个环,下面对于每个环分别考虑。
如何统计 \(A _ i\) 的贡献?首先设 \(A _ i\) 出现次数 \(c _ i = \left\lfloor{k - 1 - i \over n}\right\rfloor\),那么因为 \(l = m / g\) 次循环一次,那么这个环内所有 \(B _ j \ge A _ i\) 都有 \(\lfloor c _ i / l\rfloor\) 的贡献。任选一个 \(A _ i\),预处理出其匹配的 \(l\) 个 \(B _ j\) 依次的位置(记为 \(p\)),复制一倍后对 \(A, B\) 序列做归并,零散的最后 \(c _ i \bmod l\) 次贡献则在 \(p\) 中为一段区间,树状数组单点加 / 区间查即可维护。
对于 \(B _ i\) 的贡献同理计算,但注意 \(A _ i = B _ j\) 的情况不要算重。

浙公网安备 33010602011771号