【题解】AtCoder Beginner Contest 222 D~G

D. Between Two Arrays

Problem

好题

题意:给定长为 \(n\) 的单调不下降的整数序列 \(a,b\),且满足 \(a_i\le b_i\)。求满足 \(a_i\le c_i\le b_i\) 的单调不下降的整数序列 \(c\) 的数量。

\(1\le n\le 3000\)\(0\le a_i\le b_i\le 3000\)

前缀和优化 dp 经典题。

\(dp_{i,j}\) 表示长度为 \(i\) 且以 \(j\) 结尾的单调不下降序列数量。则: \[dp_{i,j}=\sum\limits_{k\in [0,j] \text{ }\cap \text{ }[a_{i-1},b_{i-1}]} dp_{i-1,k}\] 那么我们需要枚举 \(i,j,k\),时间复杂度 \(O(n\alpha^2)\)\(\alpha\) 为值域。

利用前缀和优化,令 \(s_{i,j}=\sum\limits_{j\in[0,j]}dp_{i,j}\)\(O(\alpha)\) 便能完成转移。

总时间复杂度 \(O(n\alpha)\)

E. Red and Blue Tree

Problem

好题

题意:给定一棵 \(n\) 个点的树和一个长为 \(m\) 的序列 \(a\) 和一个整数 \(K\),你需要给这颗树上的边染蓝色或染红色。合法的染色方案满足从 \(a_1\) 开始依次途径 \(a_2,a_3,\dots ,a_{n-1}\) 最后到达 \(a_n\) 的路径中经过的蓝边数总和 \(B\) 和红边数总和 \(R\) ,有 \(R-B=K\)。求方案数。

\(2\le n\le 1000\)\(2\le m\le 100\)

对每两个相邻的数都跑 \(\text{dfs}\) 记录每条边 $i $ 的经过次数 \(C_i\)

问题转化为:将 \(C_1,C_2,...,C_{n-1}\) 分成两个集合使得两个集合里元素的和 \(R\)\(B\) 满足 \(R-B=K\)

\(C_1+C_2+...+C_{n-1}=S\) , 则

\[\begin{cases}S=R+B\\R-B=K \end{cases}\rightarrow 2R=S+K\rightarrow R=\frac{S+K}{2}\]

问题转化为从 \(C_1,C_2,...,C_{n-1}\) 中选择若干个数使得和为 \(\frac{S+K}{2}\),dp 即可 。

具体的,令 \(dp_x\) 表示使得和为 \(x\) 的方案数, \(dp_x=\sum dp_{x-C_i}\)

F. Expensive Expense

problem

好题

题意:树上每个点有权值 \(a_i\),边也有边权 \(w_i\)。令 \(dis_{i,j}\) 表示 \(i\)\(j\) 的简单路径长度 , 对于每一个 \(i\)\(\sum\limits_{j=1,j\neq i}^n max(dis_{i,j}+a_j)\)

\(2\le n\le 2\times 10^5\)\(1\le c_i,w_i \le 10^9\)

方法一:(树的直径的性质)

一个结论:距离树上任意一点最远的点一定是直径两个端点中的一个。(这也是两次 \(\text{dfs}\) 能够求树的直径的依据)

但这里有点权,那我们可以变通。

两次 \(\text{dfs}\) 求树的直径时,将比较 \(dis_i\) 换成比较 \(dis_i+a_i\)。这样求出来的 “直径” 就是整颗树 \(dis_i+ a_i\) 最大的路径。

确定了直径的两个端点 \(ml,mr\) 后,再次应用 \(\text{dfs}\) 求出两个端点到所有点的简单路径距离 \(disl\)\(disr\)

那么对于每个 \(i\)\(ans=\max(disl_{i}+a_{ml},disr_{i}+a_{mr})\)

方法二:(换根dp)

第一次 \(\text{dfs}\)\(dp_{i,0/1}\) 代表 \(i\) 的子树内答案的最大值/次大值。那么有: \[dp_{x}=\max_{y\in son[x]}(dp_{x},dp_{y}+w,a_y+w)\] 第二次 \(\text{dfs}\) ,可以画图分析:

向下 \(\text{dfs}\) 时子树内的贡献没有改变,我们只需要分析另一边(绿色部分)多出了哪些贡献。

假设我们刚刚走过了边 \(fa\to y\),分为两种情况:

  1. (橙字)\(dp_{fa,0}\) 从非 \(y\) 子树内转移而来,那么: \[dp_y=\max(dp_y,dp_{fa,0}+w)\]

  2. (蓝字)\(dp_{fa,0}\)\(y\) 的子树内转移而来,非子树部分的最大值实际就是 \(fa\) 节点对应的次大值,那么: \[dp_y=\max(dp_y,dp_{fa,1}+w)\]

最后更新答案。

G. 222

Problem

好题

题意:幸运数字是由若干个 \(2\) 构成的数字(如 \(2,22,222,\dots\) )。给定正整数 \(k\),当 \(k\) 的倍数第一次属于某个幸运数字时。输出该倍数由多少个 \(2\) 组成。若不存在 \(k\) 的倍数是幸运数字,输出 \(-1\)

幸运数字可以表示为 \(2\times \dfrac{10^x-1}{9}\)

问题转化为寻求最小的 \(x\) 使得: \[\begin{align}2\times \dfrac{10^x-1}{9}&\equiv 0 \pmod{k} \\2\times(10^x-1) &\equiv 0 \pmod{9k} \\10^x-1 &\equiv 0 \pmod{\dfrac{9k}{\gcd(k,2)}} \\10^x &\equiv 1 \pmod{\dfrac{9k}{\gcd(k,2)}}\end{align}\] 转化为了 \(a^x\equiv b \pmod{P}\) 的形式,运用 BSGS 算法即可求解。

还可以运用欧拉函数。

回忆欧拉定理:对于互质的正整数 \(a,n\)\(a^{\varphi(n)}\equiv1\pmod{n}\) .

我们令 \(p=\dfrac{9k}{\gcd(k,2)} ,x=\varphi(p)\),则 \(10^{\varphi(p)}\equiv1\pmod{p}\),可以直接得到一个可行解。

虽然 \(\varphi(p)\) 不一定是满足条件的正整数,但答案一定是其因子,枚举即可。


【题解】AtCoder Beginner Contest 222 D~G
https://kisuraop.github.io/posts/81df370c.html
作者
KisuraOP
发布于
2023年10月16日
许可协议