Codeforces Round 1026 (Div. 2) 部分题解

D - Fewer Batteries

题目链接

二分答案,设定一个电池数上界,再求出来到达每个点最多能携带多少块电池(受到上界约束),判断能否走到 \(n\) 即可。

由于 \(u<v\) ,原图是拓扑图,可以直接从 \(1\)\(n\) 顺序扫描,该顺序构成一个拓扑序,所以求出来的值是正确的。

注意 dijikstra 是错误的,笔者也不知道为什么会想到用 dijikstra 求这个,挂了 3 发。

E - Melody

题目链接

主要讲下怎么想到欧拉路径的。

现在称两个属性为左属性和右属性

首先能想到对每个相同的左/右属性建一个虚点连边,题目限制表示为:将每个点走一遍,且一个虚点不连续走 \(2\) 遍。

接着想象虚点分左右两侧,由于一个点对于每一侧只属于一个虚点,不存在同一侧从一个虚点走到另一个同侧虚点的情况,那剩余的情况只有从一侧走到另一侧,这时候就可以想到二分图了:匹配的过程就是在两侧来回走的过程,这天然满足了一侧的点不能连续走 \(2\) 次的限制,而走一条边就等价于原题中选取一个音符!

于是就转换为二分图上将每条边都恰好走一遍,就是求欧拉路了。

这题的点集比较大,用 map 处理无向边不能正反走两遍的限制,当然链式前向星是更好的选择。由于欧拉路是以点为基础求解的,最后得到的是点方案,需要最后转化成边方案。

F - Faculty

题目链接

稳定不会数学题。

假定 \(x<y\) ,那 \(f(x,y)=x+(y \bmod x)=x+y-x\lfloor\frac{y}{x}\rfloor\) ,发现 \(\lfloor\frac{y}{x}\rfloor\geq 1\) ,当该值恰好是 \(1\) 时,\(f(x,y)=y\) ,也就是说:

\[x\leq f(x,y) \leq y \]

考虑 \(z > y\) ,有不等式:

\[f(x,y)\leq y \leq f(y,z) \]

也就是说换成一个更大值,答案更优,即最优答案中一定包含最大值,且这段序列答案的上界就是最大值,还有一个性质:

\[f(x,y) =y~(y< 2x) \]

顺序填入数:

  • \(a_i\) 不是最大值,用当前最大值 \(f(mx,a_i)\) 更新答案。
  • \(a_i\) 是最大值且 \(a_i<2\times mx\),由上述关系,上界是能达到的,此时更新最大值,答案为 \(a_i\)
  • \(a_i \geq 2\times mx\) ,此时更新最大值并做一次暴力扫描更新答案。由于此时最大值扩大了 \(2\) 倍,这个情况不会超过 \(\log(A)\) 次,\(A\) 是值域,暴力复杂度是有保证的。

最终复杂度 \(n\log(A)\)

posted @ 2025-06-04 16:07  蒻蒻虫  阅读(39)  评论(0)    收藏  举报