codeforce 随机挑战 题解

同步 link

从 *2600 开始。

CF1762F *2600

这个差 \(\le k\) 的东西比较经典,就是一个点向 \(\ge\) 它和 \(<\) 它的右边第一个点连边,此时 DAG 上它所能到达的点就是所有合法的区间。

再观察一下性质,发现就是一个不断变大的区间中数的总和。

线段树维护每个权值对应的位置以及个数,对于每个点记录向上和向下能走到的点数,然后轻松转移即可。

code

TLE 一发是因为多测,开了值域大小的线段树。

CF1762E *2600

如果确定树,那么边的赋值方案唯一,一条边的权值只和子树大小奇偶性有关。

因此直接考虑拆贡献,考虑两个点中间连边的贡献,需要 \(1\) 放在一个里面,\(n\) 放在另一个里面,贡献式子大概就是组合数乘上两边生成树数量。

注意边的一段可以是 \(1,n\),所以需要分 \(4\) 中情况讨论。

code

CF1651E *2600

注意到度数为 \(2\),说明形成若干个环。

对于每一个环,直接拆贡献,因为可能断成若干个链,直接枚举每个链的贡献,或者整个环的贡献,复杂度 \(O(n^2)\),代码比较难写。

code

CF1016F *2600

傻呗题。

先把 \(1\)\(n\) 的链抠出来,如果有一个点的外面连的点个数至少为 \(2\),那么显然只需要外面连,对路径长度无影响,否则相当于找两个点,互相之间无连边,并且一个到 \(1\),一个到 \(n\),距离之和最大。

这个记录前缀最大值就做完了。

code

CF1340D *2600

因为要最大时间最小,所以肯定贪心选前缀。

考虑 \(a\) 连向 \(b\),如果 \(b\) 没有其他儿子了,那么显然 \((a,t),(b,t+1),(b,t),(a,t+1)\),这样走最优。

稍微扩展一下,假设进入 \(x\) 的时间是 \(t\),那么如果让 \(x\)\(t-1\) 的时候出去,那么对 \(x\) 的父亲就最优。

这样得到一个很简单的做法,就一直向下递归。

但是会发现 \(t-1\) 之前的东西都空着,很浪费,因此先考虑把前面的东西用起来,那么就先传到 \(1\),然后把儿子做完,再返回即可。

code

CF273E *2600

没啥意思,求个 sg 函数,发现 \(10^9\) 很大,但是连续段很长,打个表,然后 dp 就完了。

code

CF955F *2600

注意到随着 \(k\) 的增加,答案下降的很快,开始写了个整体二分的东西,然后发现菊花图可以卡掉。

考虑除了 \(k=1\) 之外,其他的深度显然不超过 \(\log n\),因此可以按照深度 dp,设 \(f_{i,j}\) 表示 \(i\) 子树内,满足深度为 \(j\) 的最大的 \(k\) 是多少,由于对于 \(k\) 显然满足单调性。

然后就可以简单合并了。

code

posted @ 2023-03-16 09:37  houzhiyuan  阅读(46)  评论(0编辑  收藏  举报