2025.9.17 NOIP 模拟赛 题解

比赛

订正

T1 P130019 地球往事 \(\quad\) QOJ #10753. Connected Components

题意

给定 \(a_{1\sim n}\)\(b_{1\sim n}\),若 \(a_i-a_j\le i-j\le b_i-b_j\)\(a_i-a_j\ge i-j\ge b_i-b_j\) 则合并 \(i,j\) 所在连通块,求最终连通块数量,\(n\le10^6\)

分析

两个条件处理方式类似,以第一个为例,令 \(a_i\gets i-a_i,b_i\gets b_i-i\),则一个 \(i\) 需要与 \(a_j\le a_i,b_j\le b_i\)\(j\) 合并

\(a\) 为第一关键字,\(b\) 为第二关键字从小到大排序,然后分治,容易双指针处理

时间复杂度 \(O(n\log n\alpha(n))\)

代码

T2 P130020 纪元 \(\quad\) QOJ #8234. Period of a String

题意

给定 \(s_{1\sim n}\),判断能否重排所有 \(s_i\) 使得对于任意 \(i>1,0\le l<|s_i|\),有 \(s_{i,l}=s_{i-1,l\bmod |s_{i-1}|}\),若可以则构造具体方案,多测 \(T\le10^4,\sum n\le10^5,\sum|s_i|\le5\times10^6\)

分析

显然确定 \(s_1\) 后,\(s_{2\sim n}\) 都是唯一确定的

考虑一个 \(s_i\) 能对 \(s_1\) 提供什么信息

找到 \(i\) 之前第一个 \(|s_p|<|s_i|\)\(p\)(若不存在则为 \(0\)),对于任意 \(p<x<i\),显然 \(s_i\)\(s_p\) 的前缀,若 \(p=0\) 则提供一条信息:\(s_1\) 长度为 \(|s_i|\) 的前缀中,各种字母出现次数等于 \(s_i\) 中对应出现次数

\(p>0\),则 \(s_i\)\(s_p\) 重复无穷次后取长度为 \(|s_i|\) 的前缀得到的,一共 \(\left\lfloor\frac{|s_i|}{|s_p|}\right\rfloor\) 个完整的 \(s_p\) 和一个长度为 \(|s_i|\bmod |s_p|\) 的前缀

由此可以得到长度为 \(|s_i|\bmod |s_p|\) 的后缀中各种字母出现次数(若 \(|s_i|\bmod |s_p|=0\) 则结束),令 \(s_i\gets |s_i|\bmod |s_p|\) 后继续向前处理,直到 \(p=0\) 为止

这样得到 \(O(n)\) 个限制,每个限制了 \(s_1\) 某个前缀中各种字母的出现次数

根据这些限制构造合法的 \(s_1\) 是容易的

然后推出 \(s_{2\sim n}\),并检验即可

时间复杂度 \(O(\sum (n\log |s_i|(\log n+|\sum|)+\sum|s_i|\log|s_i|))\)

代码

T3 P130021 黑暗森林 \(\quad\) gym105170A. Eminor Array

\(1\sim 2^n-1\) 根据二进制下最高位划分为 \(0~n-1\)\(n\)

\(f_i\) 表示最后一个值在 \(i\) 块中且满足题目要求的序列,则答案为 \(\sum_{i=0}^{n-1} f_i\)

若所有数字都在第 \(i\) 块中,显然任意相邻三个的异或不为 \(0\),从 \(2^i\) 个数中选非空子集,方案数为 \(2^{2^i}-1\)

否则枚举 \(0\le j<i\),表示 \(j+1\sim i-1\) 块中没有数字,\(j\) 块中选择数字

考虑从 \(f_j(2^{2^i}-1)\) 中减去不合法的方案数

\(0\le j\)\(i\) 之间产生了不合法的 \((x,y,z)\),且 \(x<y<z\)\(x<2^{j+1}\)\(2^i\le z<2^{i+1}\)

\(y<2^{j+1}\) 则显然 \(x\oplus y\oplus z\ge 2^i\),因此 \(2^i\le y<z<2^{i+1}\),因此 \(2^j\le x<2^{j+1}\)

\(y=x\oplus z\)\(x\)\(j\) 位为 \(1\),要使 \(y<z\),必须 \(z\) 的第 \(j\) 位为 \(1\)

因此枚举 \(2^i\le z<2^{i+1}\)\(j\in z\)\((z,2^{i+1})\) 中的方案数为 \(2^{2^{i+1}-z-1}\)\([1,2^{j+1})\) 中方案数为 \(f_j\)\(y\) 根据 \([1,2^{j+1})\) 中的情况和 \(z\) 唯一确定

即转移为

\[f_i=2^{2^i}-1+\sum_{0\le j<i} \left((2^{2^i}-1)f_j-\sum_{2^i\le z<2^{i+1},j\in z}2^{2^{i+1}-z-1}f_j\right) \]

考虑化简 \(\sum_{2^i\le z<2^{i+1},j\in z}2^{2^{i+1}-z-1}\)

显然 \([2^i,2^{i+1})\)\(j\in z\)\(j\notin z\) 的方案数一致,且贡献 \(2^{2^{i+1}-z-1}\)\(j\notin z\) 恰好为 \(j\in z\)\(2^{2^j}\) 倍,可知

\[\begin{aligned} &\sum_{2^i\le z<2^{i+1},j\in z}2^{2^{i+1}-z-1}\\ =&\frac1{2^{2^j}+1}\sum_{2^i\le z<2^{i+1}}2^{2^{i+1}-z-1}\\ =&\frac1{2^{2^j}+1}\sum_{0\le z<2^i}2^z\\ =&\frac{2^{2^i}-1}{2^{2^j}+1} \end{aligned} \]

从而转移变为

\[\begin{aligned} f_i=&2^{2^i}-1+\sum_{0\le j<i} \left((2^{2^i}-1)f_j-\frac{2^{2^i}-1}{2^{2^j}+1}f_j\right)\\ =&2^{2^i}-1+(2^{2^i}-1)\sum_{0\le j<i} \frac{2^{2^j}}{2^{2^j}+1}f_j\\ \end{aligned} \]

容易前缀和优化

时间复杂度 \(O(n\log M)\),其中 \(M\) 为模数

代码

参考

实际上 \(f\) 有通项公式

对于

\[f_i=(2^{2^i}-1)\left(1+\sum_{0\le j<i} \frac{2^{2^j}}{2^{2^j}+1}f_j\right)\\ \]

\[g_i=1+\sum_{0\le j<i} \frac{2^{2^j}}{2^{2^j}+1}f_j \]

\[f_i=(2^{2^i}-1)g_i \]

\[\begin{aligned} g_i=&1+\sum_{0\le j<i} \frac{2^{2^j}}{2^{2^j}+1}f_j\\ =&1+\sum_{0\le j<i-1} \frac{2^{2^j}}{2^{2^j}+1}f_j+\frac{2^{2^{i-1}}}{2^{2^{i-1}}+1}f_{i-1}\\ =&g_{i-1}+\frac{2^{2^{i-1}}}{2^{2^{i-1}}+1}f_{i-1}\\ =&g_{i-1}+\frac{2^{2^{i-1}}}{2^{2^{i-1}}+1}(2^{2^{i-1}}-1)g_{i-1}\\ =&\left(1+\frac{2^{2^{i-1}}}{2^{2^{i-1}}+1}(2^{2^{i-1}}-1)\right)g_{i-1}\\ =&\frac{2^{2^{i-1}}+1+2^{2^{i-1}}(2^{2^{i-1}}-1)}{2^{2^{i-1}}+1}\cdot g_{i-1}\\ =&\frac{1+2^{2^{i-1}}\cdot 2^{2^{i-1}}}{2^{2^{i-1}}+1}\cdot g_{i-1}\\ =&\frac{2^{2^i}+1}{2^{2^{i-1}}+1}\cdot g_{i-1}\\ =&\prod_{j=1}^i\frac{2^{2^j}+1}{2^{2^{j-1}}+1}\cdot g_0\\ =&\frac{\prod_{j=1}^i(2^{2^j}+1)}{\prod_{j=0}^{i-1}(2^{2^j}+1)}\cdot g_0\\ =&\frac{2^{2^i}+1}3\cdot g_0\\ =&\frac{2^{2^i}+1}3\\ \end{aligned} \]

因此

\[f_i=(2^{2^i}-1)\cdot \frac{2^{2^i}+1}3=\frac{2^{2^{i+1}}-1}3 \]

即答案为

\[\sum_{i=0}^{n-1} \frac{2^{2^{i+1}}-1}3 \]

但无法优化复杂度

参考

T4 P130022 死神永生 \(\quad\) CF1783G Weighed Tree Radius

题意

给定 \(n\) 点的树和 \(a_{1\sim n}\)\(m\)\(a\) 的单点修改,所有修改前和每次操作后求出 \(\min_u \max_v (\text{dis}(u,v)+a_v)\)\(n,m\le2\times10^5\)

分析

每个 \(u\) 下挂两个点,边权都是 \(a_u\),则转化为求出 \(\min_u \max_v\text{dis}(u,v)\),即求树的直径的一半

离线线段树分治,转化为加入一个点维护重心,容易做到 \(O(m\log m)\)

代码

比赛结果

\(50+70+40+0\)\(\text{rk}50\)

posted @ 2025-09-21 16:02  Hstry  阅读(29)  评论(0)    收藏  举报