20260518紫题训练总结

A - 模拟工厂

赛时思路

把所有订单按照 \(t\) 从小到大排序,枚举要完成那些订单,设祂们分别为 \((t_1,g_1,m_1),(t_2,g_2,m_2),\dots,(t_k,g_k,m_k)\),现在需要判断是否存在 \(x\),满足开始时提升 \(x\) 次生产力能否满足所有订单,即 \(x<t_1\)\(\forall i\in[1,k],(t_i-x)\times x-\sum_{j<i} g_j\ge g_i\)。对于一个 \(i\),令 \(v=\sum_{j=1}^ig_j\),那么合法的 \(x\) 需满足 \(x\in[\frac{t_i-\sqrt{t_i^2-4v}}2,\frac{t_i+\sqrt{t_i^2-4v}}2]\),由于 \(x\) 是整数,所以 \(x\in[\lceil\frac{t_i-\sqrt{t_i^2-4v}}2\rceil,\lfloor\frac{t_i+\sqrt{t_i^2-4v}}2\rfloor]\)。枚举每个 \(i\),求出每个 \(i\) 的解集,对这些解集取交集,如果交集非空,那么是合法的,否则不合法。时间复杂度 \(\mathcal O(2^nn)\)

错误原因

提升生产力的操作不一定在开头。
题解

B - 火柴游戏

赛时思路

先把交换操作忽略,即将祂拆成一次加入,一次删除,最后在合并起来。设 \(f_{i,j}\) 表示把前 \(i\) 位变成相同的,用了 \(j\) 次加入所需最少的删除次数。令 \(del_{i,j}\) 表示火柴数字 \(i\) 变成 \(j\) 需要删除多少个,\(add_{i,j}\) 表示火柴数字 \(i\) 变成 \(j\) 需要加入多少个。得转移,\(f_{i+1,j+add_{a_i,k}+add_{b_i,k}}\leftarrow min(f_{i,j}+del_{a_i,k}+del_{b_i,k})\)。其中,\(a_i,b_i\) 分别表示两串第 \(i\) 位的火柴数字。
考虑计算最小答案。枚举加入次数 \(i\),令 \(j=f_{L+1,i}\),即最小删除次数,现在要求一个 \(k\),使得 \((i-k)q_1+\frac{(i-k+1)(i-k)}2p_1+(j-k)q_2+\frac{(j-k+1)(j-k)}2p_2+kq_3+\frac{(k+1)k}2p_3\),由于 \(i,j\) 都不大,直接暴力枚举。
\(\omega\) 为字符集大小,则时间复杂度为 \(\mathcal O(L^2\omega)\)

错误原因

对于相同的加入次数,更小的删除次数比一定更优,因为有可能多一些删除可以凑成一些交换,让代价变低。
题解

C - 直线拟合

赛时思路

二分答案,把问题转换成一堆圆,求是否有一条直线与所有圆相切或相交。
按照任意顺序给圆标号,如果一条直线同时穿过任意两个相邻的圆,那么这条直线穿过所有圆。对于两个圆,链接祂们的圆心,对两圆分别作垂直于圆心的直径,只要一条直线同时与这两条直径相交,那么就穿过了这两个圆。现在问题变成了有 \(2n\) 条线段,求是否有与所有线段相交的直线。
题解

posted @ 2026-05-18 21:00  Link-Cut_Trees  阅读(16)  评论(0)    收藏  举报