NOIP2020 revision
补一下历年的题,但主要也是为了给别人讲解(
排水系统
小模拟题。
题意
给出一张有向无环图和 个源点,每个源点有 单位的水,每次会平均分给几个点,求几个终点最后的结果是多少。
思路
显然流水的过程类似拓扑排序,直接写个分数结构体模拟即可。
但这样只有 分,要开 __int128
。
字符串匹配
字符串科技题。
题意
将字符串 改成 的形式,且 中出现奇数次的字符数量 中出现奇数次的字符数量。
思路
懒得重写了,口胡一个。
如果不考虑后面那个条件,显然我们可以枚举 ,判断剩下的字符串是否是 即可,也就是是否为一个周期串,利用扩展KMP可以求得其最小周期 ,显然 的长度为 的因数乘上 ,可以证明直接枚举符合条件的所有 的复杂度是 的,对于后面那个条件,我们记一下符合条件的 的前缀和就好了。
与我之前写的代码完全不一致
移球游戏
烧脑构造题。
题意
给定 个栈,栈的高度限制为 。初始时前 个上每个有 个球,最后一个为空。球分为 种颜色,每种恰好 个。一次操作可以把一个栈顶的元素弹出放到一个另一个栈顶,但是不可以使栈溢出或下溢。现要把同种颜色的球移动到同一个栈上,你需要构造一个在 次操作内的方案。
思路
一个直接的思路就是,依次使每种颜色的球达到目标。
对于含有目标颜色的球的柱子,我们肯定希望目标颜色的球都集中在上面,于是我们可以设计一个类似排序的操作方式,是的目标颜色的球被移到柱子上。
假设 号柱子是我们可以乱用的, 号柱子是空的,我们要对 号柱子进行排序, 号柱子上有 个目标颜色的球,那么可以进行如下操作:
- 将 号柱子上的 个球移到 号柱子里。
- 将 号柱子上的球全部移走,若该球为目标颜色,移到 号柱子,否则,移到 号柱子。
- 将 号柱子上的 个球移回 号柱。
- 将 号柱子上的 个球移回 号柱。
- 将 号柱子上的所有球移回 号柱。
可以注意到,在第 步之后, 号柱子上目标颜色的球都移到了 号柱上,非目标颜色的球都移到了 号柱上,接下来的 操作正好实现了排序, 操作则使其回到原本的状态,且 号柱上的球的顺序与数量相较原来并没有改变。
把 号柱都排完序后,我们不花费操作次数将 号柱与其他柱掉包一下,再来一次排序,即可使所有目标颜色的球都被放到顶端,接下来只要把他们扔到第 柱上并把剩下有缺的柱子补齐即可。
这样 轮下来的总次数不超过 ,能得到 分的好成绩,拼命优化也只能做到 次,要想AC可以用这篇题解的做法,通过构造全 柱实现,比我的次数少了一半。
微信步数
模拟+数论+结论+卡常
思路
显然,若走一轮之后走回起点且仍有剩余的起点,则无解。
有一个并不显然的结论就是,从第二轮开始,每一轮走出的点的情况都是一样的,不过感性还是能理解的。
既然这样,我们先模拟第一轮,求出第 维剩下的点数 ,再模拟第二轮,就出每轮第 维走出的点数 ,以及每轮的第 步在第 维走出的点数 ,显然从第二轮开始第 步时第 维剩余的点数为 ,总点数为 。
直接计算可得 分,考虑优化这个计算,首先可以最外层枚举余数 ,这样的好处是可以直接计算出 ,答案就是 。内层的求积显然是个关于 的 次多项式,暴力求出系数,然后用拉格朗日插值求出正整数幂和即可算出,时间复杂度为 。
然而这题非常卡常,我虽然开了 也是在 左右卡过的。
本文作者:luckydrawbox
本文链接:https://www.cnblogs.com/luckydrawbox/p/18526455
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步