【题解】NOIP 2020 移球游戏 / 微信步数

时间:2021-08-29
本文章向大家介绍【题解】NOIP 2020 移球游戏 / 微信步数,主要包括【题解】NOIP 2020 移球游戏 / 微信步数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

对比后可以发现 t4 部分分好拿,但是最后 \(20\) 分代码很复杂,考场上不太能搞。t3 的部分分给的没有 t4 猛,但是 t3 题目难度整体小于 t4,基本属于套路分治。

T3

首先考虑 \(n=2\) :考虑先将所有的柱子整理为黑上白下,然后最后通过空柱子拼凑得解。

假设一号柱子有 \(k\) 个黑球,那么:移动二号柱子的 \(k\) 个球至三号柱子,将一号柱子的黑球移到二号柱,白球移到三号柱,最后先取回三号柱的白球再取回二号柱的黑球,操作次数上限为 \(4m\)

知道做 \(n=2\) 后就不难得到一般做法了,具体可以考虑分治,再每一层中,先用上述算法整理柱子(消耗 \(4mn\) 步),然后考虑怎么拼凑。

随便取两个柱子,如果加起来黑色球多的话,那么可以先倒装一个柱子,将另一个柱子的黑白分开后,再将倒装柱子装回去;如果加起来白色球多的话,那么先取所有的黑色球,将剩下的两个白色尽可能合并后再把黑色球装回来。无论是哪种情况,单次消耗的步数都是 \(3m\)

那么一层消耗的总步数的理论上限为 \(7nm\),故总操作次数理论上限为 \(7nm\log n\),消耗的步数在题目限制的边上。

代码:提交记录 #1241578 - LibreOJ

T4

先考虑前 \(80\) 分,只需要考虑走出去的时候是哪一维走出去了即可,枚举这一维,然后看其他维有多少选择。

具体做法就是处理出 \(t(i,j)\) 表示第 \(i\) 维第 \(j\) 个位置走多久走出去,然后将 \(\sum w_i\) 个元素按照时间排序后就能线性做了。

接下来考虑满分做法,注意到对于 \(i\)\(t(i,j)\) 是一个先单调不减,后单调不增的函数。这两部分,一部分是在第一轮内就直接出去了,这样的位置个数是 \(O(n)\) 且需要的时间不超过 \(n\),暴力处理;另一部分是走了超过 \(n\) 步的,让我们来分析一下:

\(p_{j}<n\) 表示向着要走出的方向,从起点开始最远走了 \(j\) 步的时间,如果单轮走不了这么远就不定义 \(p_j\) 。注意到,因为一轮走的最远的距离并不代表一轮结束后到达的距离,所以,因为另一部分可以表示为 \(t+kn,(t<n,k\geq 1)\) ,对于 \(k=1\) 的周期,因为不需要考虑上一轮的最远距离和结束距离的偏差,所以有可能和 \(k>1\) 的周期不一样,但是对于 \(k>1\) 的周期,因为一定需要考虑上一轮最远距离和结束距离的偏差,所以一定一样。

也就是说,一个维度只需要处理 \(O(n)\) 个位置的值,剩下的位置的值都是一个一个长度不超过 \(n\) 的周期不断循环的,并且剩下的位置的值一定都大于 \(2n\),前面处理的位置一定都不超过 \(2n\) ,所以可以直接分成两部分做。

前一部分按照 \(80\) 分做法做即可,后一部分是简单的计数问题。

代码:口胡,不想实现。

原文地址:https://www.cnblogs.com/qiulyqwq/p/15202237.html