8
明天就是 NOI 2026 Day 1,在这里祝我以及参加 NOI 2026 的选手好运,NOI 2026 rp++!
赛后总结帖也许要晚一些发布。
T1 矿车交通
这道题的灵感来源于一道小学数学题:在等车回家的时候,是往车的方向走早点遇到车更快、往家的方向先走一段距离更快,还是原地等待更快?答案是一样快,因为坐的都是同一辆车。
因此可以发现换乘是没有必要的——如果 Steve 最后乘坐的是某辆矿车到达终点,那么他可以选择一直在起点等着这辆矿车并一直坐到终点。因此对于每辆矿车计算乘坐这辆矿车会在什么时候到达终点,并取最小值即可。注意特判只靠步行到达终点和 x=yx=yx=y 的情况。
T2 轮回
考虑第 iii 天时 a0a_0a0 在原序列中所对应的下标 pip_ipi ,显然当 iii 不是 mmm 的倍数时,pi=(pi−1+1) mod np_i=(p_{i-1}+1) \bmod npi =(pi−1 +1)modn;否则 pi=pi−1p_i=p_{i-1}pi =pi−1 。将 ppp 中的元素分为两部分进行计算:
* 对于 i>0i>0i>0 且 i mod m=0i\bmod m=0imodm=0 的 pip_ipi ,这些 pip_ipi 的值为 (m−1)−1,2(m−1)−1,…(m-1)-1,2(m-1)-1,\dots(m−1)−1,2(m−1)−1,… 模 nnn 意义下的值;
* 剩下的 pip_ipi 值为 −1,0,1,2,…-1,0,1,2,\dots−1,0,1,2,… 模 nnn 意义下的值。
可以发现,这两部分每一部分每 nnn 个数都会形成循环,通过计算整个循环带来的贡献,并额外加上剩下的部分即可,时间复杂度 O(n)O(n)O(n)。
T3 奇迹
考虑将 nnn 个数排成一个环,此时最近的一对 111 之间的距离不超过 ⌊nx⌋\left\lfloor\frac{n}{x}\right\rfloor⌊xn ⌋。从小到大枚举两个数的距离 ddd,将环上所有距离为 ddd 的 nnn 对点加入猜测序列中,总猜测次数不超过 ⌊n2x⌋\left\lfloor\frac{n^2}{x}\right\rfloor⌊xn2 ⌋。
T4 游戏
记 C(x,y)=∑k=1n[sufk(x)=prek(y)]dkC(x,y)=\sum\limits_{k=1}^n[\text{suf}_k(x)=\text{pre}_k(y)]d^kC(x,y)=k=1∑n [sufk (x)=prek (y)]dk,其中 sufk(x)\text{suf}_k(x)sufk (x) 为 xxx 长度为 kkk 的后缀,prek(y)\text{pre}_k(y)prek (y) 为 yyy 长度为 kkk 的前缀,[P][P][P] 表示当 PPP 成立时为 111,否则为 000。则子问题一的答案为:
C(t,t)−C(t,s)C(s,s)−C(s,t)+C(t,t)−C(t,s)\dfrac{C(t,t)-C(t,s)}{C(s,s)-C(s,t)+C(t,t)-C(t,s)} C(s,s)−C(s,t)+C(t,t)−C(t,s)C(t,t)−C(t,s)
计算 C(x,y)C(x,y)C(x,y) 是简单的:构造字符串 S=y+#+xS=y+\text{\#}+xS=y+#+x,SSS 的每一个 border 都对应一个满足 sufk(x)=prek(y)\text{suf}_k(x)=\text{pre}_k(y)sufk (x)=prek (y) 的 kkk,使用 KMP 算法计算出 SSS 的每一个 border 即可。
对于子问题二,一种可能的构造方案是先取 sss 为 ttt 的前 n−1n-1n−1 位,并在 sss 的最前方放上任意与 t2t_2t2 不同的字符,将 s,ts,ts,t 带入子问题一的公式中很容易证明这是一种合法的构造方案。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面对子问题一的式子给出证明:先只考虑一个目标串 xxx,假设有一种下注游戏,在每一轮抛硬币之前,都新来一个下注者,他下注从当前位置开始未来会出现串 xxx。具体地,他初始时拥有 111 元,下注当前字符为 x1x_1x1 ,如果猜中,则钱数变成原来的 ddd 倍,继续下注 xxx 的下一个字符;否则他的钱数直接变成 000,游戏结束。
不难发现这个游戏是公平的,即每回合结束后每个下注者的期望钱数都仍然是 111,因此若游戏进行了 TTT 回合,所有下注者拥有的钱数和的期望值也是 TTT,因此整个游戏所有下注者拥有的钱数和的期望值为 E(T)E(T)E(T)。
对于原问题,假设每一轮抛硬币之前,都会有两个下注者分别下注 sss 和 ttt。考虑计算游戏以 sss 结束时,猜 ttt 的所有下注者拥有的钱数和:想要结束时有一位连续猜中的 kkk 次的下注者,这要求 sufk(s)=prek(t)\text{suf}_k(s)=\text{pre}_k(t)sufk (s)=prek (t),并会带来 dkd^kdk 的贡献,这就是式子 C(x,y)C(x,y)C(x,y) 的由来。
设 Steve 获胜的概率为 ppp,则 Alice 获胜的概率为 1−p1-p1−p,那么对于猜测 sss 的所有下注者,其拥有的钱数和的期望值为 pC(s,s)+(1−p)C(t,s)pC(s,s)+(1-p)C(t,s)pC(s,s)+(1−p)C(t,s)。类似地,对于猜测 ttt 的所有下注者,其拥有的钱数和的期望值为 pC(t,t)+(1−p)C(s,t)pC(t,t)+(1-p)C(s,t)pC(t,t)+(1−p)C(s,t)。
按照刚刚的结论,我们发现这两个式子都等于 E(T)E(T)E(T),所以 pC(s,s)+(1−p)C(t,s)=pC(t,t)+(1−p)C(s,t)pC(s,s)+(1-p)C(t,s)=pC(t,t)+(1-p)C(s,t)pC(s,s)+(1−p)C(t,s)=pC(t,t)+(1−p)C(s,t),解方程即可得到上面的结论。
有帮助,赞一个