USACO 2024年2月月赛

S1

观察发现,所有靶子右上角必须斜率负数,右下角必须斜率正数,左端点没有要求。先判断斜率中负数和正数的数量是否都达到 n,否则无解。

其次,如果现在有两条线和两个 x 相等的点,斜率较大的线配了 y 较小的点。交换这两个匹配,发现让两个与 y 轴的交点更靠近了。由此得出结论:对于 x 相等的两个点,y 越大,配的斜率也要越大。

因此,记一共有 neg 个斜率为负数的直线,则所有左端点中 y 值最小的 negn 个点配的是斜率负数的直线,剩下的左端点配的是斜率正数的直线。

斜率为正为负可以独立计算。我们只需要算出 斜率负数中与 y 轴最高的交点最低是多少 和 斜率正数中与 y 轴最低的交点最高是多少,两者做差即可。

因为两种情况是对称的,这里只写斜率正数的情况。

把斜率从大到小排序,从大到小遍历,对于每个斜率,暴力找到当前还没匹配好的、与它构成的截距最高的点,同时与它匹配。

这个贪心为什么正确?

反证法。假如有两个斜率 si>sj,交换了之后可以使两个截距的距离缩短。交换了之后,显然 si 的截距会变低,否则与我们的贪心法矛盾了。那 sj 的截距应该低得更多。但是设 si 在贪心法中配对的是 (x,y),则它的截距是 ysix,现在 sj 的截距是 ysjx,由于 si>sj,所以 sj 的截距反而变高了,矛盾。贪心法正确。

正确是正确,但是每次暴力找点,一共找 n 次,复杂度 O(n2) 会爆掉。

观察问题:“最低的最高是多少”,这就是二分的经典语句。于是考虑二分这个最高的值 y,于是可以通过 b=ysixymax 求出每个点的 si 应该 某个数,然后再排个序看下是否能满足每个 si 条件即可。

S2

把一个颜色段看作一个球。现在有三个栈。初始 1,2 有球,3 空。

依次判断。

  1. 如果 1,2 中都只有一种颜色且 3 空,结束。

  2. 1,2 的栈顶元素不一样且 3 为空时,把 1,2 中球数量多的那个栈的栈顶放到 3 里。

  3. 否则先判断是否三个栈都非空,若是:

    1. 1,2 的栈顶相同,球较多的 pop 栈顶。

    2. 1,32,3 的栈顶相同,不妨 1,3 的栈顶相同。记这个栈顶球颜色为 clr。若 1 只剩这一个球且 clr 仅剩 1,3 这两个球,则 3 弹栈;否则 1 弹栈。

  4. 若不是:

    1. 3 为空,则此时 1,2 的栈顶相同,令 1,2 中较多的弹栈。

    2. 否则不妨 1 空。判断:

      1. 2,3 都仅剩一个球,令 3 的栈顶进入 1

      2. 2,3 栈顶相同,令 3 弹栈。

      3. 否则,令 2 的栈顶进入 1

S3

以下一切都在 Bessie 采用了最佳策略,即 Elsie 的最差情况下考虑。

chg[i][0] 表示第 i 轮猜偶数的最大收益(可能为负数),chg[i][1] 表示第 i 轮猜奇数的最大收益。

i1m,每次执行如下操作:

  1. 如果选 Even,之后还能构造出一种可行方案,选 Even,并更新当前血量;

  2. 如果选 Odd,之后还能构造出一种可行方案,选 Odd,并更新当前血量;

  3. 否则,无解。

现在的问题就是怎么判断之后是否有可行方案。记当前血量是 now,“之后存在一种可行方案” 等价于 “如果之后 Elsie 都采取最优方案,不会血量归零”。

Elsie 的最优方案是什么?即每一个回合若 chg[i][0]>chg[i][1],则猜 0;否则猜 1

考虑另外一个数组 mn[i]mn[i]=min(0,minj=im{k=ijmax(chg[k][0],chg[k][1])}),即一个最小前缀。

显然这个数组是可以 O(m)m1 地递推的。

如果现在是第 i 轮,当前血量是 now,则 “猜偶数之后存在可行方案” 等价于 “now+chg[i][0]+mn[i+1]>0”,猜奇数同理。

posted @   FLY_lai  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示