Always keep a |

luckydrawbox

园龄:4个月粉丝:1关注:2

NOIP2020 revision

补一下历年的题,但主要也是为了给别人讲解(

排水系统

Link\text{Link}

小模拟题。

题意

给出一张有向无环图和 mm 个源点,每个源点有 11 单位的水,每次会平均分给几个点,求几个终点最后的结果是多少。

思路

显然流水的过程类似拓扑排序,直接写个分数结构体模拟即可。

但这样只有 9090 分,要开 __int128

字符串匹配

Link\text{Link}

字符串科技题。

题意

将字符串 SS 改成 (AB)iC(AB)^iC 的形式,且 AA 中出现奇数次的字符数量 C≤ C 中出现奇数次的字符数量。

思路

懒得重写了,口胡一个。

如果不考虑后面那个条件,显然我们可以枚举 CC,判断剩下的字符串是否是 (AB)i(AB)^i 即可,也就是是否为一个周期串,利用扩展KMP可以求得其最小周期 xx,显然 ABAB 的长度为 SCx\frac{|S|-|C|}{x} 的因数乘上 xx,可以证明直接枚举符合条件的所有 ABAB 的复杂度是 O(nlogn)O(n\log n) 的,对于后面那个条件,我们记一下符合条件的 AA 的前缀和就好了。

与我之前写的代码完全不一致

移球游戏

Link\text{Link}

烧脑构造题。

题意

给定 n+1n+1 个栈,栈的高度限制为 mm。初始时前 nn 个上每个有 mm 个球,最后一个为空。球分为 nn 种颜色,每种恰好 mm 个。一次操作可以把一个栈顶的元素弹出放到一个另一个栈顶,但是不可以使栈溢出或下溢。现要把同种颜色的球移动到同一个栈上,你需要构造一个在 820000820000 次操作内的方案。

思路

一个直接的思路就是,依次使每种颜色的球达到目标。

对于含有目标颜色的球的柱子,我们肯定希望目标颜色的球都集中在上面,于是我们可以设计一个类似排序的操作方式,是的目标颜色的球被移到柱子上。

假设 11 号柱子是我们可以乱用的,n+1n+1 号柱子是空的,我们要对 xx 号柱子进行排序,xx 号柱子上有 tt 个目标颜色的球,那么可以进行如下操作:

  1. 11 号柱子上的 tt 个球移到 n+1n+1 号柱子里。
  2. xx 号柱子上的球全部移走,若该球为目标颜色,移到 11 号柱子,否则,移到 n+1n+1 号柱子。
  3. n+1n+1 号柱子上的 mtm-t 个球移回 xx 号柱。
  4. 11 号柱子上的 tt 个球移回 xx 号柱。
  5. n+1n+1 号柱子上的所有球移回 11 号柱。

可以注意到,在第 22 步之后,xx 号柱子上目标颜色的球都移到了 11 号柱上,非目标颜色的球都移到了 n+1n+1 号柱上,接下来的 343、4 操作正好实现了排序,55 操作则使其回到原本的状态,且 11 号柱上的球的顺序与数量相较原来并没有改变。

2n2\sim n 号柱都排完序后,我们不花费操作次数将 11 号柱与其他柱掉包一下,再来一次排序,即可使所有目标颜色的球都被放到顶端,接下来只要把他们扔到第 n+1n+1 柱上并把剩下有缺的柱子补齐即可。

这样 nn 轮下来的总次数不超过 (4m+2nm+2m)×n2+2mn×n=mn2+5m1100000\frac{(4m+2nm+2m)\times n}{2}+2mn\times n=mn^2+5m\le 1100000,能得到 8080 分的好成绩,拼命优化也只能做到 870000870000 次,要想AC可以用这篇题解的做法,通过构造全 00 柱实现,比我的次数少了一半。

微信步数

Link\text{Link}

模拟+数论+结论+卡常

思路

显然,若走一轮之后走回起点且仍有剩余的起点,则无解。

有一个并不显然的结论就是,从第二轮开始,每一轮走出的点的情况都是一样的,不过感性还是能理解的。

既然这样,我们先模拟第一轮,求出第 ii 维剩下的点数 aia_i,再模拟第二轮,就出每轮第 ii 维走出的点数 bib_i,以及每轮的第 1j1\sim j 步在第 ii 维走出的点数 fj,if_{j,i},显然从第二轮开始第 tn+r(1rn)tn+r(1\le r\le n) 步时第 ii 维剩余的点数为 aifr,ibi×ta_i-f_{r,i}-b_i\times t,总点数为 i=1kaifr,ibi×t\prod_{i=1}^ka_i-f_{r,i}-b_i\times t

直接计算可得 4545 分,考虑优化这个计算,首先可以最外层枚举余数 rr,这样的好处是可以直接计算出 tmax=min1inbi0aifr,ibit_{max}=\min_{1\le i\le n 且 b_i\ne0}\frac{a_i-f_{r,i}}{b_i},答案就是 r=1ni=0tmaxj=1kajfr,jbj×i\sum_{r=1}^n\sum_{i=0}^{t_{max}}\prod_{j=1}^ka_j-f_{r,j}-b_j\times i。内层的求积显然是个关于 iikk 次多项式,暴力求出系数,然后用拉格朗日插值求出正整数幂和即可算出,时间复杂度为 O(nk2)O(nk^2)

然而这题非常卡常,我虽然开了 O2\text{O2} 也是在 970ms970ms 左右卡过的。

本文作者:luckydrawbox

本文链接:https://www.cnblogs.com/luckydrawbox/p/18526455

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   luckydrawbox  阅读(4)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起