Atcoder试题乱做 Part1

开工第一个 $\text{Atcoder}$ 的 $\text{Part}$ , 虽然可能会做到自闭, 但痛并快乐着也挺有趣不是吗/ybyb .


$\text{[ARC066E]Addition and Subtraction Hard}$

$\color{green}{\text{[EASY]}}$

$ok$ 我现在知道这种括号匹配咋 $dp$ 了, 以后不会傻逼了.

首先不难发现, 左括号一定要添在减号后面, 这个时候我就不知道咋想了, 大概瞄了一眼题解发现我是傻逼, 经典套路不会.

设 $f_{i,j}$ 表示考虑到前 $i$ 个数, 有 $j$ 个括号未匹配的最大值. 你会发现这个 $dp$ 转移巨大困难, 因为一个地方可以添加一堆括号, 开始对自己的做法产生怀疑.

冷静分析后可以发现, 嵌套不会超过两次括号, 那么就可以优化状态设计了, 设 $f_{i,0/1/2}$ 表示考虑到第 $i$ 个数, 有 $0/1/2$ 个左括号未匹配的最大值, 这个时候转移就方便了, 考虑括号减少, 增加和先减后增即可.

时间复杂度 $\mathcal{O}(n)$ .


$\text{[AGC033C]Removing Coins}$

$\color{green}{\text{[EASY]}}$

不难发现每次要么是干掉所有叶子, 要么是留一个叶子, 再就想到最终轮次和树的直径有关, 也不难发现每次操作树的直径会减少 $1$ 或者 $2$ , 剩下的就只剩 $SG$ 递推了.


$\text{[AGC022F]Checker}$

$\color{blue}{\text{[NORMAL]}}$

根据删除操作连边, 不难看出最后会形成一棵树, 对于一条边不妨将留下的那个点作为父亲, 根也就是最后剩下的点.

我们会发现, 无论大小关系如何, 假设我们是要求 $a$ 对于 $b$ 对称后的点, 那么总有 $val_a \leftarrow 2val_b-val_a$ , 其中 $val_i$ 表示点 $i$ 当前的值.

我们考虑直接写出根最后的结果, 一定会是形如 $\sum\limits_{i=1}^{n}{c_i2^{d_i}x^i}$ 的形式, 其中 $c_i$ 为一个系数, 取值为 $1$ 或 $-1$ , $d_i$ 为点 $i$ 在树上的深度.

同时可以发现 $2^n \ll x$ , 也就是说, 在这个计算式中, 任意两个点对最终结果的贡献不会被抵消, 所以原问题等价于对于 $n$ 个二元组 $(c_i,d_i)$ 的不同方案的计数.

我们会发现, $d_i$ 的实质是每个深度有多少个点而不是树的形态, 意思是我们可以先钦定好树的每个深度有多少点后再用多重组合数的形式来确定每个点上放哪个值.

接下来再考虑 $c_i$ , 手玩后不难发现影响 $c_i$ 的值的因素只有两个, 点 $i$ 的儿子的个数和每个祖先在选完与使点 $i$ 和该祖先相连的链之后再选则其它儿子的儿子个数, 也就是 $c_i=(-1)^{\text{儿子个数+每个祖先在选完与其相连的链后继续选的儿子个数}}$ , 此处建议读者自行画一个树模拟一个点在按操作顺序操作后会被哪些点影响.

以下我们为简便直接称 $c_i$ 为点 $i$ 的权值, 由于一个点的权值只会和儿子与祖先相关, 所以如果我们在最后一层加上一个点, 影响到的只会是其父亲以及其先前加入的兄弟节点, 对于其以后可能的儿子则不做考虑.

所以我们能发现我们并不在乎一个点的权值究竟是 $1$ 还是 $-1$ , 只需要知道它的权值是否与父亲相同就可以确定二元组了.

考虑 $dp$ , 设 $f_{i,j}$ 表示已经考虑了 $i$ 个点且树的最后一层有 $j$ 个点的儿子数为奇数的方案, 这里这样设计状态的原因是方便确定树的大致形态而不必精细, 即方便计算多重组合数, 算是一个套路, 转移方法也是套路.

我们可以发现如果一个点有 $x$ 个儿子, 那么儿子中有 $\lceil \frac{x}{2} \rceil$ 个点的权值与父亲不同, 按加入顺序编号会是奇数编号的点.

转移时就枚举下一层的点数 $k$ , 可以推出在不考虑该层点儿子的情况下有 $\lfloor \frac{j+k}{2} \rfloor$ 个点的权值与其父亲不同.

但是显然不一定有这么多点的权值与父亲不同, 因为有儿子的影响还没算上, 所以我们再枚举算上儿子后和父亲权值不同的点的个数 $l$ , 那么这一层就应该有 $|l-\lfloor \frac{j+k}{2} \rfloor|$ 个点的儿子数是奇数.

所以转移就是 $f_{i+k,|l-\lfloor \frac{j+k}{2} \rfloor|} = f_{j+k,|l-\lfloor \frac{j+k}{2} \rfloor|}+f_{i,j}\times \binom{i+k}{i}\times \binom{k}{l}$ .

时间复杂度为 $\mathcal{O}(n^4)$ .


$\text{[AGC033D]Complexity}$

$\color{green}{\text{[EASY]}}$

空间开大了, 时间常数也变大, 受教育了.

首先不难发现答案不会超过 $\log_{2}{nm}$ , 因此可以将答案直接放进状态里, 受教育了, 设 $f_{i,j,k,l}$ 表示从第 $i$ 行, 第 $j$ 列到第 $k$ 列, 答案为 $l$ 时, 最多能延申到哪一行.

转移的时候考虑横着切还是竖着切.

  • 横着切, $f_{i,j_1,j_2,k} = f_{f_{i,j_1,j_2,k-1},j_1,j_2,k-1}$ .
  • 竖着切, 设切成 $[j_1,j_3]$ 和 $[j_3+1,j_2]$ 两个部分, 那么 $\min\{f_{i,j_1,j_3,k-1},f_{i,j_3+1,j_2,k-1}\}$ 是这样分的答案, 那么 $f_{i,j_1,j_2,k}$ 即为这些最小值种的最大值, 显然, $j_1$ 和 $j_2$ 差距越小, $dp$ 值越大, 所以可二分.

初始化答案为 $0$ 的时候即可.

时间复杂度 $\mathcal{O}(n^3\log^{2}{n})$ , 卡点常能过.


$\text{[AGC021F]Trinity}$

$\color{red}{\text{[HARD]}}$

其实我觉得这题没有难到那种程度? 想给 $\color{blue}{\text{[NORMAL]}}$ 的.

注意到行列的差异性, 行只要求记录最小的列标号, 所以我们可以考虑一列一列的填.

其实我觉得这种题的本质都是一半多重组合数一半分类讨论或者啥牛逼想法.

设 $f_{i,j}$ 表示前 $i$ 列构成的矩阵中已经有 $j$ 行确定了最小位置的方案数, 转移的时候考虑新增加的列会给 $j$ 造成 $\Delta j$ 的贡献.

  • $\Delta j = 0$ , 那么只用在已有的 $j$ 个里面考虑选最值即可, 可以是空集, 有一个, 和两个, 故为 $1+j+\dbinom{j}{2}$ .
  • $\Delta j \not= 0$ , 那就有三种情况, 最后给这三种情况求和即可得到 $\dbinom{j+\Delta j+2}{\Delta j+2}$ .
    1. 最值全在新增的里面选, 那么我们只要确定新增的是哪些即可, 故为 $\dbinom{j+\Delta j}{\Delta j}$ .
    2. 最值有一个在新增的里面选, 一个在已有的数里面选, 不难发现这个东西和在现有总共 $j+\Delta j$ 个数里面选 $\Delta j+1$ 个数构成一个双射, 区分一下最大最小值即可, 故为 $2\dbinom{j+\Delta j}{\Delta j+1}$ .
    3. 最值均不来自新增的数, 类似的可以得到转移系数应该为 $\dbinom{j+\Delta j}{\Delta j+2}$ .

整理一下式子,

答案即为 $\sum\limits_{i=0}^{n}{\binom{n}{i}f_{m,i}}$ .

化简一下式子,

令 $F_i(x) = \sum\limits_{j=0}^{n}{\frac{f_{i-1,j}}{j!}x^j}$ , $G_i(x) = \sum\limits_{j=0}^{n}{\frac{1}{(j+3)!}x^j}$ .

则,

时间复杂度为 $\mathcal{O}(nm\log{n})$ .


$\text{[AGC025E]Walking on a Tree}$

$\color{green}{\text{[EASY]}}$

记一条边被覆盖的次数为 $cnt_e$ , 那么答案的上界显然是 $\sum\limits_{e \in E}{\min\{2,cnt_e\}}$ .

为方便记树边为 $(a,b)$ , 记路径为 $\{a,b\}$ , 这里的路径无方向.

考虑一种构造方案, 任取一个叶子 $x$ , 设其父亲为 $y$ .

  • 若 $cnt_{(x,y)}=0$ , 那么直接删掉点 $x$ 与边 $(x,y)$ 后对答案无影响.
  • 若 $cnt_{(x,y)} > 0$ , 那么覆盖该边的路径一定有一个端点是 $x$ .
    1. 若 $cnt_{(x,y)}=1$ , 那么这条边无论哪个方向都对答案的贡献为 $1$ , 故把路径 $\{x,a\}$ 改成 $\{y,a\}$ , 并删掉点 $x$ 和边 $(x,y)$ , 对答案无影响.
    2. 若 $cnt_{(x,y)} > 1$ , 我们任取两条经过 $(x,y)$ 的路径 $\{x,a\}$ , $\{x,b\}$ , 分别定向 $x\rightarrow a$ , $x \leftarrow b$ , 设两路径的交点为 $z$ , 则 $x$ 到 $z$ 的所有边的贡献均为 $2$ , 之后这两条路径等价于删掉这两条路径, 新增一条无向路径 $\{a,b\}$ , 其余路径用 $cnt_e=1$ 的方式传递给 $y$ .

不断执行该操作直到只剩一个点.

现在只剩下一个问题, 如何理解任取两条路对答案的贡献都是一样的.

我们根据构造过程不难发现, 我们构造出的答案满足所有边的贡献均为 $\min\{2,cnt_e\}$ , 权值和达到上界, 也就说明任取无问题.

对于每个点用 $set$ 维护一下路径即可.

时间复杂度 $\mathcal{O}(n(n+m)\log{m})$ .


$\text{[AGC033E]Go around a Circle}$

$\color{blue}{\text{[NORMAL]}}$

显然 $RB$ 互换后答案不变, 故只考虑 $S_1 = R$ 的情况.

首先如果全部都是 $R$ , 那么显然限制条件是不能有两个连着的 $B$ , 设 $f_i$ 表示长度为 $i$ 的序列的方案数.

转移的时候就枚举该位置是什么如果选 $R$ 则加上 $f_{i-1}$ , 否则加上 $f_{i-2}$ , 最终答案是 $f_{n-1}+f_{n-3}$ , 原因就是钦定最后一个位置是什么, 如果是 $R$ 那么就是 $f_{n-1}$ 的方案数, 如果是 $B$ , 那么也就是说开头和前一个位置都要是 $R$ , 所以方案数为 $f_{n-3}$ .

如果不全是 $R$ , 也就是 $S$ 中存在 $B$ . 首先还是有 $B$ 不能相邻这个限制, 并且至少有一个 $B$ . 然后我们能发现环上被 $B$ 分割成了若干 $R$ 的连续段, 不难发现这些连续段长度都得是奇数, 否则就会出现环上某一个点, 到环上 $R$ 连续段的两边的步数同为奇数或者偶数, 并且一定同时存在, 因为长度为 $2$ 的时候就同时存在了, 所以一定存在某个点恰好不能走一种奇数或者偶数的步数.

我们还能发现, $S$ 里面起到作用的只有长度为奇数的 $R$ 段长度和开头的 $R$ 段, 末尾的 $R$ 段不用管, 因为不用在意结束位置, 且如果是偶数段的话可以视作在原位.

同时环上 $R$ 连续段的长度也不能超过, 奇数的 $R$ 段长度里最小的, 不然就可能出现走不完的情况, 开头也是同理, 所以两者取最小即可.

有这些条件后就可以 $dp$ 了, 大概是设 $f_i$ 表示前 $i$ 个位置划分成若干完整的段的方案数, 前缀和优化即可, 时间复杂度为 $\mathcal{O}(n)$ .