USACO 2024年2月月赛
观察发现,所有靶子右上角必须斜率负数,右下角必须斜率正数,左端点没有要求。先判断斜率中负数和正数的数量是否都达到 \(n\),否则无解。
其次,如果现在有两条线和两个 \(x\) 相等的点,斜率较大的线配了 \(y\) 较小的点。交换这两个匹配,发现让两个与 \(y\) 轴的交点更靠近了。由此得出结论:对于 \(x\) 相等的两个点,\(y\) 越大,配的斜率也要越大。
因此,记一共有 \(neg\) 个斜率为负数的直线,则所有左端点中 \(y\) 值最小的 \(neg-n\) 个点配的是斜率负数的直线,剩下的左端点配的是斜率正数的直线。
斜率为正为负可以独立计算。我们只需要算出 斜率负数中与 \(y\) 轴最高的交点最低是多少 和 斜率正数中与 \(y\) 轴最低的交点最高是多少,两者做差即可。
因为两种情况是对称的,这里只写斜率正数的情况。
把斜率从大到小排序,从大到小遍历,对于每个斜率,暴力找到当前还没匹配好的、与它构成的截距最高的点,同时与它匹配。
这个贪心为什么正确?
反证法。假如有两个斜率 \(s_i>s_j\),交换了之后可以使两个截距的距离缩短。交换了之后,显然 \(s_i\) 的截距会变低,否则与我们的贪心法矛盾了。那 \(s_j\) 的截距应该低得更多。但是设 \(s_i\) 在贪心法中配对的是 \((x,y)\),则它的截距是 \(y-s_ix\),现在 \(s_j\) 的截距是 \(y-s_jx\),由于 \(s_i>s_j\),所以 \(s_j\) 的截距反而变高了,矛盾。贪心法正确。
正确是正确,但是每次暴力找点,一共找 \(n\) 次,复杂度 \(O(n^2)\) 会爆掉。
观察问题:“最低的最高是多少”,这就是二分的经典语句。于是考虑二分这个最高的值 \(y\),于是可以通过 \(b=y-s_ix\le y_{max}\) 求出每个点的 \(s_i\) 应该 \(\ge\) 某个数,然后再排个序看下是否能满足每个 \(s_i\) 的 \(\ge\) 条件即可。
把一个颜色段看作一个球。现在有三个栈。初始 \(1,2\) 有球,\(3\) 空。
依次判断。
-
如果 \(1,2\) 中都只有一种颜色且 \(3\) 空,结束。
-
若 \(1,2\) 的栈顶元素不一样且 \(3\) 为空时,把 \(1,2\) 中球数量多的那个栈的栈顶放到 \(3\) 里。
-
否则先判断是否三个栈都非空,若是:
-
若 \(1,2\) 的栈顶相同,球较多的 pop 栈顶。
-
若 \(1,3\) 或 \(2,3\) 的栈顶相同,不妨 \(1,3\) 的栈顶相同。记这个栈顶球颜色为 \(clr\)。若 \(1\) 只剩这一个球且 \(clr\) 仅剩 \(1,3\) 这两个球,则 \(3\) 弹栈;否则 \(1\) 弹栈。
-
-
若不是:
-
若 \(3\) 为空,则此时 \(1,2\) 的栈顶相同,令 \(1,2\) 中较多的弹栈。
-
否则不妨 \(1\) 空。判断:
-
若 \(2,3\) 都仅剩一个球,令 \(3\) 的栈顶进入 \(1\);
-
若 \(2,3\) 栈顶相同,令 \(3\) 弹栈。
-
否则,令 \(2\) 的栈顶进入 \(1\)。
-
-
以下一切都在 Bessie 采用了最佳策略,即 Elsie 的最差情况下考虑。
令 \(chg[i][0]\) 表示第 \(i\) 轮猜偶数的最大收益(可能为负数),\(chg[i][1]\) 表示第 \(i\) 轮猜奇数的最大收益。
令 \(i\leftarrow 1\sim m\),每次执行如下操作:
-
如果选 Even,之后还能构造出一种可行方案,选 Even,并更新当前血量;
-
如果选 Odd,之后还能构造出一种可行方案,选 Odd,并更新当前血量;
-
否则,无解。
现在的问题就是怎么判断之后是否有可行方案。记当前血量是 \(now\),“之后存在一种可行方案” 等价于 “如果之后 Elsie 都采取最优方案,不会血量归零”。
Elsie 的最优方案是什么?即每一个回合若 \(chg[i][0]>chg[i][1]\),则猜 \(0\);否则猜 \(1\)。
考虑另外一个数组 \(mn[i]\):\(mn[i]=\displaystyle\min(0,\min_{j=i}^{m}\{\sum_{k=i}^j\max(chg[k][0],chg[k][1])\})\),即一个最小前缀。
显然这个数组是可以 \(O(m)\) 从 \(m\) 到 \(1\) 地递推的。
如果现在是第 \(i\) 轮,当前血量是 \(now\),则 “猜偶数之后存在可行方案” 等价于 “\(now+chg[i][0]+mn[i+1]>0\)”,猜奇数同理。