C

首先考虑 \(n = 2\) 怎么做。

可以发现的是我们一定要借助空柱子 \(n + 1\),并且两个柱子都必须要移动。

注意到此时本质上就是将两种球分类,于是我们考虑能否将一个柱子上两种颜色分开(并对其他柱子不产生影响)。

假设要将 \(1\) 上两种颜色分开,并且 \(1\) 颜色在上 \(2\) 在下。

令 \(1\) 柱子上有 \(a\) 个 \(1\) 那么我们考虑现在第 \(2\) 个柱子上先预留 \(a\) 个空位,将这些球先全部转移到 \(n + 1\) 上。

然后对于第一个柱子上的球从上到下考虑,若当前顶端的球为 \(1\) 则放到 \(2\) 柱子上,否则放到 \(n + 1\) 上。

然后先将 \(n + 1\) 上方的 \(m - a\) 个 \(2\) 球还原到 \(1\) 柱子,再将 \(2\) 上方的 \(a\) 个 \(1\) 球还原到 \(1\) 柱子,最后将 \(n + 1\) 剩下的球还原到 \(2\) 柱子。

容易发现这样对 \(2\) 柱子没有影响且操作合法达成了目的,仔细定量发现操作数是 \(2m + 2a\) 的。

我们对两个柱子都做上面的操作将 \(1\) 放到上面来,然后就可以轻松达成目标了。

接下来回到原问题,此时我们发现上述做法的本质是:将柱子 \(x\) 上颜色为 \(c\) 的球上提到顶端且 \(x\) 上其他球相对位置不变,同时不会对其他柱子产生影响。

此时考虑按照颜色依次还原,假设当前考虑到了颜色 \(c\) 对上述柱子将 \(c\) 全部提到顶端,然后将 \(c\) 移到空柱子上接着任选一个柱子将球全部分配到非满柱子上,就递归为删去这个颜色的子问题。

分析操作次数,对于每种颜色需要对每个柱子均操作一次,因此操作次数:\(\sum\limits_{i = 1} ^ n i2m + 2nm = n(n + 3)m\),已经可以通过 \(70\) 分,考虑进一步优化。

容易发现上述做法操作较多的原因是对 每种颜色 都重新做一轮,这样事实上浪费了很多操作。

那么能否考虑减少有效颜色的操作呢?考虑分治。

我们每次考虑将编号 \(\le mid\) 的球染成白色,剩下的球染成黑色,目标同样是将柱子上清成同一种颜色。

令对于长度为 \(n\) 的序列操作次数为 \(f(n)\),那么总操作次数应该为 \(f(n) \log n\),于是只需要考虑上述问题如何做即可。

类似上提的思路,我们考虑每次任选一个至少有两种颜色的柱子 \(x\),然后再任选一个 \(y \ne x\),在没有完成目标时总能做到。

令 \(x_0, x_1, y_0, y_1\) 分别为 \(x\) 上白球/黑球数量,\(y\) 上白球/黑球数量。

发现总存在 \(x_0 + y_0 \ge m\) 或 \(x_1 + y_1 \ge m\),不妨设 \(x_0 + y_0 \le m, x_1 + y_1 \ge m\)。

于此同时,我们不妨设 \(x_0 \le y_0 \le \frac{m}{2}\)。

我们首先对 \(x\) 将白球上提,消耗次数 \(2m + 2x_0\)。

然后将 \(x\) 上的白球全部移动到空柱子上,消耗次数 \(x_0\)。

对 \(y\) 上的球从上到下考虑,若顶端球为白色,那么移动到空柱子上,否则移动到 \(x\) 上直到 \(x\) 上球满为止,至多操作 \(x_0 + y_0\) 次。

最后将 \(n + 1\) 上的球全部运回 \(y\) 上,消耗次数 \(x_0 + y_0\)。

这样 \(x\) 上的球全部变为黑色,且因为 \(x_0 + y_0 \le m\) 所以空柱子上球不会爆出来。

计算上面的总次数:\(2m + 5x_0 + 2y_0 \le 5.5m\),因此我们做到了总操作次数 \(5.5nm\log n\)。

带入满分的数据范围大约是 \(660000\) 次,可以轻松通过。

当然可以底层直接实现 \(70\) 分的 \(n(n + 3)m\) 次操作的小常数做法,可能可以达到更优的次数。

D

首先考虑一个暴力,先判掉无解的情况。

注意到题目需要求所有初始局面的存活时间,于是我们类似期望存活时间的转化,令 \(f(x)\) 为初始位置为 \(x_1, x_2, \cdots x_m\) 的存活时间,那么答案为:

\[\sum\limits_t ^ \infty \sum\limits_x [f(x) \ge t]
\]

这等价于令 \(f(t)\) 表示 \(t\) 时刻任然存活的初始局面数量,那么答案为:

\[\sum\limits_t ^ \infty f(t)
\]

此时我们发现,\(f(t)\) 的数量是每个维度存活数量的积,那么每个维度之间就是相互独立的了。

注意到有效时间至多只有 \(nw\) 天,于是可以考虑枚举天数然后暴力维护当天每个维度依然存活的数量,复杂度 \(\mathcal{O}(nmw)\)。

考虑优化这个过程,显然问题在于如何优化暴力枚举天数部分。

令 \(f_i(t)\) 为维度 \(i\) 在时刻 \(t\) 依然存活的初始状态数量,此时我们有如下关键观察(证明不难):

  • \(f_i(t)\) 在时刻 \(n + 1\)(也即第二轮)开始呈周期长度为 \(n\) 的定值长度减少。

同时我们可以观察到减少的定值长度为 \(q_i = \sum\limits_{j = 1} ^ n [c_j = i] \times d_j\)。

那么我们令总共经过了 \(t\) 整轮 后就不存在局面存活了,那么第 \(2 \sim t\) 轮的贡献可以描述为:

\[\begin{aligned}
\sum\limits_{i = 2} ^ t \sum\limits_{j = 1} ^ n \prod\limits_{k = 1} ^ m f_k(n + j) - q_k \times (i - 2) \\
\end{aligned}
\]

不妨做简单变换:\(t \leftarrow t - 2, f_i(n + j) \leftarrow f_i(j)\),那么上式即:

\[\begin{aligned}
& \ \ \ \ \ \sum\limits_i ^ t \sum\limits_{j = 1} ^ n \left(\prod\limits_{k = 1} ^ m f_k(j) - q_k \times i\right) \\
&= \sum\limits_{i = 1} ^ n \sum\limits_j ^ t \left(\prod\limits_{k = 1} ^ m f_k(i) - q_k \times j\right)
\end{aligned}
\]

令 \(g_i(j) = \prod\limits_{k = 1} ^ m f_k(i) - q_k \times j\),容易发现这是一个仅与 \(i\) 有关的 \(m\) 次多项式,于是上式等价于求 \(n\) 个给定的 \(m\) 次多项式的前缀点值的和。

有经典结论 \(m\) 次多项式的非负前缀点值和为一个 \(m + 1\) 次多项式,于是我们就可以插值得到 \(x = t\) 处的点值。

复杂度 \(\mathcal{O}(nm ^ 2)\),瓶颈在于计算 \(n\) 个多项式 \(0 \sim m + 1\) 处的点值。

有点轻微卡常,需要将拉格朗日插值换成连续点值的 \(\mathcal{O}(m)\) 插值。

NOIP2020 部分简要题解的更多相关文章

  1. Noip 2014酱油记+简要题解

    好吧,day2T1把d默认为1也是醉了,现在只能期待数据弱然后怒卡一等线吧QAQ Day0 第一次下午出发啊真是不错,才2小时左右就到了233,在车上把sao和fate补掉就到了= = 然后到宾馆之后 ...

  2. Tsinghua 2018 DSA PA2简要题解

    反正没时间写,先把简要题解(嘴巴A题)都给他写了记录一下. upd:任务倒是完成了,我也自闭了. CST2018 2-1 Meteorites: 乘法版的石子合并,堆 + 高精度. 写起来有点烦貌似. ...

  3. Codeforces 863 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 简要题解?因为最后一题太毒不想写了所以其实是部分题解... A题 传送门 题意简述:给你一个数,问你能不能通过加前导000使其成为一个回文数 ...

  4. HNOI2018简要题解

    HNOI2018简要题解 D1T1 寻宝游戏 题意 某大学每年都会有一次 Mystery Hunt 的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为 ...

  5. JXOI2018简要题解

    JXOI2018简要题解 T1 排序问题 题意 九条可怜是一个热爱思考的女孩子. 九条可怜最近正在研究各种排序的性质,她发现了一种很有趣的排序方法: Gobo sort ! Gobo sort 的算法 ...

  6. BJOI2018简要题解

    BJOI2018简要题解 D1T1 二进制 题意 pupil 发现对于一个十进制数,无论怎么将其的数字重新排列,均不影响其是不是 \(3\) 的倍数.他想研究对于二进制,是否也有类似的性质. 于是他生 ...

  7. CQOI2018简要题解

    CQOI2018简要题解 D1T1 破解 D-H 协议 题意 Diffie-Hellman 密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码)的情况下,通过不安全的信 ...

  8. AtCoder ExaWizards 2019 简要题解

    AtCoder ExaWizards 2019 简要题解 Tags:题解 link:https://atcoder.jp/contests/exawizards2019 很水的一场ARC啊,随随便便就 ...

  9. Comet OJ - Contest #2 简要题解

    Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...

随机推荐

  1. 《从LFS到自己的Linux发行版》系列教程:一步到位体验LFS11.0

    ​​ 目录 前言 第一节:LFS 准备工作 第二节:一步完成你的 LFS11.0 第三节:开启你的 LFS 系统 结语 前言 如果你把从源代码开始编译构建一个操作系统的工作当成厨师做一桌菜的话,Lin ...

  2. 关于使用JupyterNotebook运行代码运行到一半会闪退的问题

    前几个星期使用Jupyter远程使用师兄的电脑跑了一段沐老师的代码学习,但是总是跑了一段就闪退,同时因为是远程桌面,远程桌面也被挤掉了. 具体表现就是:运行代码--表现正常,打印记录--远程桌面掉线- ...

  3. JS事件冒泡与事件捕获怎么理解?

    在js中存在事件冒泡与事件捕获两种概念,这两个概念都是为了解决页面中事件流(事件发生顺序)的问题. 事件冒泡(dubbed bubbling) 事件冒泡我们从字面意思理解就是当用户行为触发我们页面的定 ...

  4. python call函数

    call()函数本质上是将一个类的实例转换成一个函数,例如下列示例: class Sample: def __init__(self, x, y): self.x = x self.y = y def ...

  5. go.mod file not found in current directory or any parent directory; see 'go help modules'

    go的环境设置问题,执行 go env -w GO111MODULE=auto 我的环境:Windows 7, Go 1.17 D:\Apps\GOPATH\src\code.oldboyedu.co ...

  6. 谈谈 StringBuffer 和 StringBuilder 的历史故事

    1.前言 众所周知,StringBuffer 是线程安全的 ,而StringBuilder 不是线程安全的  ,但是 StringBuilder 速度会更快. 事实上 作为一个字符串拼接 方法 ,在线 ...

  7. Centos7 查看文件命令总结

    ls命令 ls -d --文件或者目录是否存在 ls -l 或者ll --显示详细信息 ls -lt --文件按时间顺序排序(升序) ls -ltr --按时间倒叙排序 ls -i --显示索引节点 ...

  8. Object.keys()方法 返回对象属性数组

    MDN语法 Object.keys(obj) 参数obj:要返回其枚举自身属性的对象. 返回值:一个表示给定对象的所有可枚举属性的字符串数组. 1.传入一个对象,返回的的是所有属性值 var obj2 ...

  9. Python入门(上)

    Python入门(上) Python入门(上) 简介 Python 基础语法 行与缩进 注释 运算符 标准数据类型 变量 编程流程 顺序(略) 分支 if 循环 for while break 和 c ...

  10. LG1290 欧几里德的游戏

    https://www.luogu.com.cn/problem/P1290 博弈论游戏,用到mod. 辗转相除法的过程,会构成n种状态. 到达最后一个状态就赢了. 对于一次过程如果div>1那 ...