[ABC402] C-F

[ABC402C] Dislike Foods

处理出每个食物最后一个被接受的食材是什么,然后对食材列表累计多少个食物会在此处被加进来。

最后再前缀一下就可以了。

Code

[ABC402D] Line Crossing

对于两根线,两端点编号相加模 \(N\) 结果相同和两线平行是充要条件。

将圆视作一个数轴,那么这两个端点到 \(\frac{(A_i+B_i)\mod N}{2}\) 的弧长是相等的,根据初中几何,我们能很容易推出这条弦与这条直径所在直线垂直。因此两端点编号相加模 \(N\) 结果相同意味着两条弦与同一条直线垂直,即两线平行。

反之,两线平行,即两条弦与同一条直线垂直,那么一定存在一条直径满足同时与两条弦垂直。根据初中几何,我们能很容易推出对于每条线段两个端点到某个定点的弧长是相等的。即两端点编号相加模 \(N\) 结果相同成立。

因此以 \((A_i+B_i)\mod N\) 为属性值,求属性值不同的数对个数即可。具体的,记录每个值的属性值个数,累加的时候加上不同的个数即可。每个数对会被计数两次,输出一半即可。

Code

[ABC402E] Payment Required

\(N\) 的范围并不大。考虑到题目的 AC 状态不同会影响到选择的策略,因此要存储每个题目的 AC 状态。

因此我们设计 \(dp_{mask,t}\) 为花了 \(t\) 元,AC 状态的掩码为 \(mask\) 时,在这之后用最优策略能得到的分数。因此对于每个状态,遍历所有可以做的题目,选择期望得到分数最多的状态进行转移,有 \(dp_{mask,t}=\max\{dp_{mask,t+c_i}(1-p_i)+p_i(dp_{newmask,[t+c_i]}+s_i)\}\ (1\leq i\leq n)\),其中 \(newmask\) 是 AC 后得到的新掩码。

最后输出 \(dp_{0,0}\) 即可。时间复杂度 \(O(NX2^N)\)

Code

[ABC402F] Path to Integer

直接爆搜复杂度是 \(C^n_{2n}\),上限可以跑到 \(1.3×10^{11}\),一定超时。

考虑折半搜索,记录对角线上的每个格子的所有可能从左上角过来的目前的数字值,再从右下角开始搜索,到达对角线之后在前面存下来的数字值中二分找最优解即可。记得在计算的过程中需要用到底数为 \(10\) 的幂,需要预处理。

时间复杂度 \(O(N2^N)\)

Code

posted @ 2025-04-19 23:21  羽绘  阅读(49)  评论(0)    收藏  举报