Atcoder试题乱做 Part2

感受下来, 思维难度有参差, 所以还是可以做的, 虽然有的题和中国赛题差距有点大, 但是无伤大雅?

新的 \(\text{Part}\) 我要自己做出来更多题!


\(\text{[AGC014D]Black and White Tree}\)

\(\color{green}{\text{[EASY]}}\)

发现点一个叶子结点的父亲变白点, 那这个叶子就一定要点黑点, 然后这两个点就对其他的部分不造成影响了, 可以删掉, 所以如果一个点有两个叶子结点儿子, 那么直接就是先手胜利.


\(\text{[AGC004F]Namori}\)

\(\color{blue}{\text{[NORMAL]}}\)

树的话是, 经典套路奇偶层染色, 变成交换草走. 那么就可以考虑一个子树里面需要移进多少, 移出多少, 分值为 \(1,-1\) , 那么就可以定义 \(a_i\) 为这个子树内值的和. 显然根不为 \(0\) 无解, 答案下界为 \(\sum\limits_{i=1}^{n}{|a_i|}\) , 不难构造这就是最优答案.

接着考虑基环树, 偶环的时候考虑环边是 \(u \rightarrow v\) , 假定这个边会操作 \(x\) 次, 那么一边的父亲操作会多 \(x\) 次, 另一边少 \(x\) 次, 断掉这个边之后按树跑出 \(a_i\) , 答案即为:

\[\sum_{i\in left}{|a_i-x|}+\sum_{i\in right}{|-a_i-x|}+|-x| \]

就是求解中位数.

如果是奇环, 那么那个环边就可以让黑点数量 \(+2\) 或者 \(-2\) , 所以只要黑点白点数量差为偶数, 就一定可以通过调和来让整张图有解.

直接给答案和那条环边的两个点加上全图黑点与白点的差除以 \(2\) , 然后按树的做法即可.


\(\text{[AGC028D]Chords}\)

\(\color{green}{\text{[EASY]}}\)

\(n=2N\) , 这个圆看成序列也是一样的, 如果 \([l_1,r_1]\)\([l_2,r_2]\) 相交但不包含, 就在一个连通块.

考虑计算每个连通块对答案的贡献次数. 令 \(f_{i,j}\) 表示区间 \([i,j]\) 任意连边, 且 \(i\)\(j\) 在同一个连通块内的方案数.

枚举这样的区间, 区间长度一定是偶数, 设 \(g_{x}\) 表示 \(x\) 个点的环任意连边的方案数, \(c_{i,j}\) 表示 \([i,j]\) 内还没确定连边情况的点的个数.

转移为 \(f_{i,j}=g_{c_{i,j}}-\sum\limits_{k=i+1}^{j-1}{f_{i,k}g_{c_{k+1,j}}}\) , 答案为 \(\sum{f_{i,j}g_{n-2k-c_{i,j}}}\) , 时间复杂度 \(\mathcal{O}(n^3)\) .


\(\text{[AGC007E]Shik and Travel}\)

\(\color{green}{\text{[EASY]}}\)

比较简单的一道题.

显然可以二分, 一条边恰好经过两次, 所以只能走完一棵子树, 再去走另一个. 考虑 \(dp\) , 设 \(f_{x,u,v}\) 表示从结点 \(x\) 开始, 第一个走到的叶子结点距离为 \(u\) , 走回 \(x\) 时的距离为 \(v\) , 路径上所有长度不大于二分值的情况下遍历完整个子树, 是否可行.

转移很显然, 然后发现当满足 \(a_1 \leqslant a_2,b_1 \leqslant b_2\) 时, \(f_{x,a_2,b_2}\) 完全没有存在的必要, 故按 \(u\) 排序后 \(v\) 递减时数量最少.

可以分析合并次数, 只在轻边的时候会合并, 合并 \(\log\) 次, 故状态总数为 \(n\log{n}\) 个.

时间复杂度 \(\mathcal{O}(n\log^2{n})\) .


\(\text{[AGC052D]Equal LIS}\)

\(\color{blue}{\text{[NORMAL]}}\)

挺好猜的, 但确实不好构造.

令原排列的 \(LIS\) 长度为 \(l\) .

\(l\) 为偶数, 那么直接令 \(f_i\) 为以 \(i\) 结尾的最长上升子序列长度, 将 \(f_i \leqslant \frac{l}{2}\) 的放入第一个序列, 其他的放入第二个序列即可.

否则 \(l\) 为奇数, 即 \(l=2k+1\) , 那么对于其中一个长度为 \(l\)\(LIS\) , 要存在一个元素 \(x\) 不在此序列中, 且存在一个长度为 \(k+1\) 的上升子序列包含它.

这个条件的必要性显然, 充分性构造如下.

任选一个长度为 \(l\)\(LIS\) , 根据这个性质, 选择 \(x\) 并假设这个 \(k+1\) 的上升子序列为 \(p_1,p_2,\dots,p_{k+1}\) .

将所有满足 \(\forall 1 \leqslant j \leqslant k+1\) , \(f_i \not= f_{p_j}\)\(f_i=f_x\)\(i \not= x\) 的选入第一个序列, 其余的选入第二个序列.

第二个序列中, 所有的 \(p_i\) 都被选入, 并且只有 \(k+1\) 种不同的 \(f\) 取值, 即不存在 \(k+2\) 的上升子序列, 故构成 \(k+1\) 的上升子序列.

第一个序列中, 由于总共只有 \(2k+1\)\(f\) 的取值, 所以第一个序列中包含 \(k+1\) 种取值, 故也构成 \(k+1\) 的上升子序列.

关于判定, 求出每一个元素为起点和终点的最长上升子序列, 即可求出强制包含某个元素的最长上升子序列, 判定其是否大于等于 \(k+1\) 即可.

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


\(\text{[AGC006C]Rabbit Exercise}\)

\(\color{green}{\text{[EASY]}}\)

若选中点 \(a\) , 则期望的新位置为 \(\dfrac{(2x_{a+1}-x_a)+(2x_{a-1}-x_a)}{2} = x_{a+1}+x_{a-1}-x_a\) .

根据期望的可加性, \(E_a' = E_{a+1}+E_{a-1}-E_a\) , 这个式子只有加减, 涉及的项也相邻, 考虑差分.

令差分数组为 \(d\) , 不难发现 \(E_a' = E_{a-1}+d_{i+1}\) , 所以 \(d_i'=d_{i+1}.d_{i+1}' = d_i\) , 实际上是交换了差分数组位置.

那一次大操作就是一个置换, 我们可以单 \(\log\) 类似快速幂的做, 也可以做到线性.

具体来说就是把置换拆成若干个循环, 循环要移动的距离其实就是 \(k\bmod{size}\) 位, 递推即可.

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


\(\text{[AGC009E]Eternal Average}\)

\(\color{blue}{\text{[NORMAL]}}\)

我觉得很巧妙, 是不可多得的好题.

把问题写成 \(k\) 叉树的形式, 一共 \(n+m\) 片叶子其中 \(n\) 片写着 \(0\) , \(m\) 片写着 \(1\) . 对于一个非叶子结点, 它的值为它儿子的值的平均值.

假设那 \(n\)\(0\) 的深度分别为 \(x_i\) , \(m\)\(1\) 的深度分别为 \(y_i\) , 则根结点的值就是 \(\sum\limits_{i=1}^{m}{(\frac{1}{k})^{y_i}}\) , 并且我们知道, 假设所有点都是 \(1\) , 会有 \(\sum\limits_{i=1}^n{(\frac{1}{k})^{x_i}}+\sum\limits_{i=1}^m{(\frac{1}{k})^{y_i}}\) , 若满足这两个条件, 则一定能构成合法的 \(k\) 叉树.

我们把 \(\sum\limits_{i=1}^{m}{(\frac{1}{k})^{y_i}}\) 写成 \(k\) 进制下的小数形式, \(Z=(0.\overline{z_1z_2\dots})_k\) , 即 \(m\)\((\frac{1}{k})^{y_i}\) 相加, 而 \((1-Z)\) 则可以表示 \(n\)\((\frac{1}{k})^{x_i}\) 相加, 不考虑进位, 则 \(\sum{z_i}=m\) , 考虑还原进位则将 \(z_i\) 减去 \(1\) 并将 \(z_{i+1}\) 加上 \(k\) , 所以 \(\sum{z_i}+a(k-1)=m\) , 即 \(\sum{z_i}\equiv m\pmod{k-1}\) , 假设小数有 \(len\) 位, 则 \(1-Z\) 的位数和应该是 \((len-1)(k-1)+k-\sum{z_i}=len(k-1)-\sum{z_i}+1\) .

接下来就可以 \(dp\) 方案数了, 设 \(f_{i,j,0/1}\) 表示 \(len=i\) , \(\sum{z_i}=j\) , \(z_i\) 是否为 \(0\) , 转移很简单.

\[f_{i,j,0}=f_{i-1,j,0}+f_{i-1,j,1}\\ f_{i,j,1}=\sum_{x=1}^{k}{f_{i-1,j-x,0}+f_{i-1,j-x,1}} \]

前缀和优化一下即可, 时间复杂度 \(\mathcal{O}(n^2)\) .


\(\text{[AGC041D]Problem Scores}\)

\(\color{blue}{\text{[NORMAL]}}\)

感觉还是有点巧妙的, 但也算是去单调性的常用做法.

首先应该先把第三个限制转化, 最开始我只转化为了前 \(k+1\) 个的和要大于后 \(k\) 个的和, 但是很明显的发现, 并不好 \(dp\) , 所以肯定还要转化一下.

但是显然只看限制三是已经没有前途的了, 结合限制一来看, 我们发现, 因为有单调性的限制, 所以我们只用考虑中点是否符合限制即可.

即需满足 \(\sum\limits_{i=1}^{\lfloor\frac{n}{2}\rfloor+1}{a_i}\geqslant \sum\limits_{i=n-\lfloor\frac{n}{2}\rfloor+1}^{n}{a_i}\) , 简单证明一下, 对于小于 \(\lfloor\frac{n}{2}\rfloor\) 的位置, 左边减去一个较小的数, 右边减去一个较大的数, 仍满足, 对于大于 \(\lfloor\frac{n}{2}\rfloor\) 的数, 左边加上一个较大的数, 右边加上一个较小的数, 仍满足, 当然这个的前提是有单调性.

但是有这个单调性我们还是不好做, 继续考虑转化, 我们考虑差分去掉这个单调性, 令 \(\Delta a_i=a_i-a_{i-1}\) , 为了不让 \(\Delta a_1\) 很奇怪, 我们令 \(a_0 = 1\) , 这样每个 \(a_i\) 实际上就是 \(a_i=1+\sum\limits_{i=1}^{i}{\Delta a_i}\) .

整理一下式子,

\[\sum_{i=1}^{\lfloor\frac{n}{2}\rfloor}{\sum_{j=1}^{i}{\Delta a_j}}\geqslant \sum_{i=n-\lfloor\frac{n}{2}\rfloor+1}^{n}{\sum_{j=1}^{i}{\Delta a_j}} \]

向下取整会影响一点东西, 但其实问题不大, 还是分类一下吧.

对于 \(n\) 是奇数时, \(\lfloor\frac{n}{2}\rfloor\) 就是 \(\frac{n-1}{2}\) , 整理,一下式子

\[\sum_{i=1}^{\frac{n+1}{2}}{\sum_{j=1}^{i}{\Delta a_j}} \geqslant \sum_{i=\frac{n+1}{2}+1}^{n}{\sum_{j=1}^{i}{\Delta a_j}}\\ 2\sum_{i=1}^{\frac{n+1}{2}}{\sum_{j=1}^{i}{\Delta a_j}} \geqslant \sum_{i=1}^{n}{\sum_{j=1}^{i}{\Delta a_j}}\\ 2\sum_{i=1}^{\frac{n+1}{2}}{(\frac{n+1}{2}-i+1)\Delta a_i} \geqslant \sum_{i=1}^{n}{(n-i+1)\Delta a_i}\\ \sum_{i=1}^{n}{c_i\Delta a_i} \leqslant 0 \]

其中, \(c_i=\begin{cases}i-2 & ,\;i\leqslant \frac{n+1}{2}\\n-i+1 & ,\;i>\frac{n+1}{2}\end{cases}\) .

同样的, 考虑偶数, 最后可以推出来 \(c_i=\begin{cases}i-2 & ,\;i\leqslant \frac{n}{2}+1\\n-i+1 & ,\;i>\frac{n}{2}+1\end{cases}\) , 综合一下得到, \(c_i=\begin{cases}i-2 & ,\;i\leqslant \lfloor\frac{n}{2}\rfloor+1\\n-i+1 & ,\;i>\lfloor\frac{n}{2}\rfloor+1\end{cases}\) .

好, 现在我们只有限制二没用上了, 即 \(\sum{\Delta a_i}+1\leqslant n\) , 我们发现有的序列是本质相同的, 使得它不同的原因是 \(\Delta a_1\) .

于是我们考虑确定 \(\Delta a_2 \sim \Delta a_n\) 的值的时候有多少合法的 \(\Delta a_1\) , 有两个条件 \(\begin{cases}\Delta a_1\leqslant n-1-\sum\limits_{i=2}^{n}{\Delta a_i}\\ \Delta a_1 \geqslant \sum\limits_{i=2}^{n}{c_i\Delta a_i} \end{cases}\) , 所以合法的个数就是 \(\max\{0,n-\sum\limits_{i=2}^{n}{(c_i+1)\Delta a_i}\}\) .

我们令 \(f_i\)\(\sum\limits_{i=2}^{n}{(c_i+1)\Delta a_i}=i\) 的个数, 那么最终答案就是 \(\sum\limits_{i=0}^{n-1}{(n-i)f_i}\) .

不难发现计算 \(f_i\) 就是一个背包, 第 \(i\) 个物品重量为 \(c_i+1\) , 做无限背包, 时间复杂度 \(\mathcal{O}(n^2)\) .


\(\text{[AGC041F]Histogram Rooks}\)

\(\color{red}{\text{[HARD]}}\)

\(too\;hard\;for\;me\) , 题解差评, 不应该强加笛卡尔树上去的, 容斥检验成果题? 成果检查到不合格.

最初想法, 枚举哪些格子没有被覆盖, 然后对于一个位置如果行列都没有被钦定未覆盖的格子, 那么方案数是 \(2\) .

复杂度爆炸.

注意到如果一个格子被钦定未被覆盖, 那么他所在的列一定不能放棋子, 行有机会可以放, 重新设计容斥方案.

枚举哪些列里面有格子是未被覆盖的, 那么这些列都不可以放棋子, 设这些列的集合为 \(S\) .

此时考虑一个极长行连续段的贡献, 假设有 \(p\) 个格子在 \(S\) 里, 那么贡献有两种.

  1. \(p\) 个格子可以被覆盖, 方案数 \(2^{len-p}\) .
  2. 枚举有几个格子是未覆盖的, 方案数为 \(\sum\limits_{i=1}^{p}{\binom{p}{i}(-1)^i}=-[p\not=0]\) .

但这样算出来会是错的, 因为 \(S\) 里的列可能没有被钦定的格子.

再套上一个容斥, 枚举集合 \(T\subseteq S\) , 表示没有被钦定的格子.

设一个极长连续段里面有 \(q\) 个格子在 \(T\) 里, 那么第二种贡献变成 \(-[p\not=q]\) .

注意到此时贡献只和 \(p,[p\not=q]\) 有关, 所以状态数不会太大.

每次从 \(h\) 最小的地方切开, 下面是一个矩形, 上面是子问题, 且子问题是树形结构, 矩形里的连续段就是上面的子问题加单独算的列.

于是设 \(f_{x,p,0/1}\) 表示树上的结点 \(x\) , \(S\) 的大小为 \(p\) , 是否有 \(p\not=q\) .

转移背包合并即可, 独有的列可以看做特殊的儿子, 此时每一列方案数是相同的, 快速幂即可.

时间复杂度 \(\mathcal{O}(n^2\log{n})\) , 预处理后 \(\mathcal{O}(n^2)\) .


\(\text{[AGC043D]Merge Triplets}\)

\(\color{green}{\text{[EASY]}}\)

挺有意思的一道题的, 不算难, 其实多想一会应该是能想出来的, 可惜想这题的时候想了一会就摆了.

首先发现, 能构造出来的序列有一个显然的必要条件, 一个数作为新排列的前缀 \(\max\) 的时候, 长度不会超过 \(3\) , 并且如果存在长度为 \(3\) 的段, 那它在原排列中一定在一组里, 但这个条件并不充分.

既然不会超过 \(3\) , 那我们关注一下 长度为 \(2\)\(1\) 的, 可以发现, 如果存在一个长度为 \(2\) 的, 首先这两数一定在同一组, 并且那一组一定存在一个长度为 \(1\) 的.

这时候我们应该敏锐的考虑同组的在新排列的前缀 \(\max\) 序列中的构成, 长度为 \(3\) , 或者是三个长度为 \(1\) 的, 或者是一个长度为 \(2\) 的和一个长度为 \(1\) 的, 最后一种前后顺序并不重要, 一定是会有合法构成方案的.

这时候充分条件就很显然了, 长度为 \(2\) 的段数不超过长度为 \(1\) 的段数.

考虑如何计数, 由于只关注长度为 \(2\) 的段数和长度为 \(1\) 的段数差, 所以可以设 \(f_{i,j}\) 表示考虑前 \(i\) 个数, 长度为 \(1\) 的段数减去长度为 \(2\) 的段数值为 \(j\) 的方案数.

如果 \(a_i\)\([1,r]\) 中是最大的, 对于长度为 \(n\) 的排列, 答案就是 \(\frac{n!}{\prod{r}}\) , 转移的时候带到系数里即可.

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


这个 \(\text{Part}\) 也让我成长了不少啊.

posted @ 2022-09-26 21:27  Lonely923  阅读(32)  评论(0编辑  收藏  举报