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\) ,也就是说:
考虑 \(z > y\) ,有不等式:
也就是说换成一个更大值,答案更优,即最优答案中一定包含最大值,且这段序列答案的上界就是最大值,还有一个性质:
顺序填入数:
- 若 \(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)\) 。

浙公网安备 33010602011771号