闲话 23.3.25
闲话
我看看今天要写什么杂题……
感谢 APJ 老师的杂题!\APJ/\APJ/\APJ/\APJ/
模拟赛
GDKOI2023 Day2。感谢神秘题(咬牙)。
T1
思路不难。三个点间的路径肯定交于一点 \(s\),我们可以解方程找到 \(s\to u/v/w\) 的长度。
首先对每个点找到前三长的不交链,这个是经典问题,我们可以 \(O(n)\) 地换根 dp 或 \(O(n\log n)\) 线段树。
随后我们需要对每个询问找到是否存在可行的 \(s\)。这是经典三维偏序问题,可以转成二维偏序,排序后用树状数组维护前缀最小值即可。
找到后只需要树上倍增找到 \(u,v,w\) 即可。总时间复杂度 \(O(n\log n)\)。
Submission.
T2
神秘题。设 \(V = 2^{n} - 1\)。
首先纯暴力的复杂度是 \(O(K2^{2n})\) 的。可以发现这个过程能用 FWT 优化,因此做到 \(O(K2^nn)\)。考场上都能推到这里。
题解说答案数组存在线性递推。设转移 \(i\) 次后对 \(x\) 的答案是 \(f(i, x)\),可以发现 \(f(i)\) 视为一个序列时每位都存在线性递推,即若 \(f(i, x)\) 组成向量 \(\bm f_i\),有 \(f_i = \sum_{j = 1}^m a_j\times \bm f_{i - j}\)。
这个 \(a_j\) 可以用 BM 算出来。具体地,我们设 \(f'_i = \sum_{j = 0}^{V} r_j f(i, j)\),其中 \(r_j\) 是个随机数,则 \(f'_i\) 也存在线性递推,和 \(\bm f_i\) 相同。这就是哈希了一下。\(m = O(n)\),所以我们可以朴素预处理前 \(O(n)\) 个 \(f(i)\),复杂度是 \(O(n^2 2^n)\) 的。实际上 \(m\) 约为 \(80\)。
因为长度很短,可以随便用什么方法(Fiduccia 甚至矩阵快速幂)算出前 \(m\) 项值贡献的系数,随后对 \(V\) 个值求一下递推即可。
Submission.
T3
不算太神秘的题。下面的东西都是考场上写的。(调整了格式)
不离线可能没法做,我们考虑离线,这样先 dfs 维护完子树内信息,再静态查询。
考虑用长剖合并子树 \(k\) 深度内信息;位运算考虑拆位。
设 \(g(b, \text{id})\) 表示 \(u\) 在长剖数组内的位置是 \(\text{id}\),\(g(b, \text{id} + k)\) 表示 \(u\) 子树内小于等于 \(k\) 深度的所有点对应的答案在 \(2^b\) 项系数;
\(f(b, \text{id}, 0/1)\) 的定义类似,是 \(\sum v\) 在 \(2^b\) 项系数。
首先考虑统计答案。假设本节点在长剖数组里的位置是 \(\text{id}\),我们按位统计:
- 如果这一位 \(b\) 高于 \(\log_2(最大深度)\),发现这位不可能被进位,直接统计 \((f(b, \text{id}, 1) - f(b, \text{id}, 0)) \times 2^b\) 即可。
- 如果 \(k > 最大深度\) 直接统计 \(g(b, \text{id}) \times 2^b\) 即可。
- 反之我们需要做进位,先剥离 \(k\) 的低 \(i\) 位和剩下的部分;记低 \(i\) 位是 \(\text{lbit}\),剩下的部分是 \(\text{hbit}\),答案首先统计 \((g(b, w) - g(b, w + \text{hbit})) \times 2^b\)。
然后是 \(\text{lbit}\),我们发现它进位的部分只可能是一个后缀。考虑这个后缀的形态:
如果这个后缀的最高位没到 \(b\) 位,那退化成 1.;
反之这个后缀的长度一定是 \(2^b\),两次差分即可。
然后考虑计算 \(f\) 和 \(g\)。
首先我们向长儿子递归,数组是连续的,这自然合并了长儿子。然后我们不加更改地对除长链外的儿子做合并,这复杂度是 \(O(n)\) 的。这是两个同等深度的后缀和数组做合并,不需要额外计算信息。
最后对 \(f\) 数组合并进当前节点的贡献,也就是 \(f(i, \text{id}, v_u 第 i 位)\) 自增 \(1\) 并简单地维护 \(f(b, \text{id}, 0/1)\) 处的前缀和性质。
合并完子树贡献后考虑计算当前节点的答案,也就是 \(g\) 函数。
如果没有长儿子,退化成叶子:\(g(b, \text{id}) = f(b, \text{id}, 1)\)。
反之类似上面地统计答案,这时的阈值是长链的长度。
如果当前位超过 \(长链长度\times 2\) 则连进位都不用考虑,直接退化成 \(f(b, \text{id}, 1)\);
反之讨论进位的范围。这里需要注意的是,最终的进位位置一定形如 111100001111...00001111
,我们每次剥离最低的一段 \(1\) 作进位。
如果超过了则只需要考虑最高位的进位,我们仍然有上面的性质,即只考虑最后 \(b\) 个位置的进位。
值就是 \(f(b, \text{id}, 1) - f(b, \text{id} + 2^b, 1) + f(b, \text{id} + 2^b, 0)\),这里第二次差分不用考虑长度。
如果没超过,我们发现需要统计一段答案在 \(2^b\) 项的系数。这是递推的形式,我们要的就是 \(g(b, \text{id} + 2^{b + 1})\)。
值就是 \(f(b, \text{id}, 1) - f(b, \text{id} + 2^b, 1) + f(b, \text{id} + 2^b, 0) - f(b, \text{id} + 2^{b + 1}, 0) + g(b, \text{id} + 2^{b + 1})\)。
Submission.
杂题
给定长度为 \(n\) 的正整数序列 \(s\)。对正整数 \(r\),\(f(r)\) 表示满足以下条件的三元组 \((a,b,c)\) 的个数:
- \(c\in[1,r],a,b\in[0,c)\)。
- \(y_i = a\times s_i + b\) 模 \(c\) 对 \(i\) 单调递增,即 \(\forall i, \ y_i < y_{i + 1}\)。
请计算
\[\lim_{r\to \infty}\frac{f(r)}{r^3} \pmod {998244353} \]\(2\le n\le 10^3, \ \sum s_i \le 5\times 10^5\)。
盯这题好久了,一直不敢写。感谢 \(\text{A}\color{red}{\text{PJifengc}}\) 老师的细致讲解让我有勇气写这题!
设 \(S = \sum s_i\),记实数 \(x\) 的小数部分为 \(\{x\}\)。
考虑我们要计数三个不定的元,这不太好刻画,先指定一个元。
设 \(g(k)\) 表示满足以下条件的三元组 \((a,b,c)\) 的个数:
- \(c = k,a,b\in[0,c)\)。
- \(a\times s_i + b\) 模 \(c\) 对 \(i\) 单调递增。
可以知道 \(g\) 就是 \(f\) 的差分,即 \(f(r) = \sum_{k = 1}^r g(k)\)。
能够证明极限 \(\lim\limits_{k\to \infty} \dfrac{g(k)}{k^2}\) 存在,并设它为 \(c\)。这样,我们应用 O'Stolz 定理即可说明
我们接下来只需要计算 \(c\)。\(c\) 的存在性将在最后给出,因为我们必须要先表示出 \(c\),随后才能按这个等价描述证明收敛性。
性质表明 \(y_i = a\times s_i + b\text{ mod } k\) 关于 \(i\) 递增。可以发现,如果我们将 \(y_i\) 除以 \(k\),\(y_i / k\) 的小数部分也关于 \(i\) 递增,这也就是 \(\left\{(a/k) s_i + (b/k)\right\}\) 关于 \(i\) 递增。由于 \(\dfrac{a}{k},\dfrac{b}{k}\in [0, 1)\),我们不妨考虑一个 \(\mathbb R^2\) 的子空间 \(D\),定义为
这样我们又可以定义 \(g(k)\) 为 \(D\) 的一个子空间的大小,也就是 \(g(k) = \left\lvert\left\{(a, b) \in \mathbb Z^2 \mid 0\le a, b < k, \ (a / k, b / k)\in D \right\}\right\rvert\)。由于 \(D\) 是一个有界闭集,它的大小是收敛的。我们在最后还将证明 \(c\) 收敛于 \(D\) 的大小。这里先考虑如何计算 \(c\),也就是 \(D\) 的大小,证明留在最后。
接下来不考虑 \(\left\{\alpha s_i + \beta \right\}= \left\{\alpha s_{i + 1} + \beta\right\}\),因为这对区域 \(D\) 的大小没有影响。
考虑把 \([0, 1)\) 首尾相接组成一个环,并让 \(\left\{\alpha s_i + \beta \right\}\) 作为这环上一个点。我们称 \(0,1\) 相接的位置为断点。考虑在 \(\alpha, \beta\) 变化过程中计算合法的范围。
\(\beta\) 只是平移,暂且不管,先考虑在 \(\alpha\) 变化的过程中 \(\left\{\alpha s_i\right\}\) 这些点的情况。我们设 \(f_i(\alpha)\) 为点 \(\left\{\alpha s_i\right\}\) 到点 \(\left\{\alpha s_{i + 1}\right\}\) 顺时针方向的距离,也就是 \(f_i(\alpha) = \left\{\alpha (s_{i + 1} - s_i)\right\}\)(定义 \(s_{n + 1} = s_1\))。可以发现,对一个 \(\alpha\) 存在 \(\beta\) 使得满足条件当且仅当 \(\sum_{i = 1}^n f_i(\alpha) = 1\),也就是这 \(n\) 个位置顺时针排列。
然后考虑计算 \(\beta\) 的范围。这其实就是把这 \(n\) 个顺时针排列的位置不断旋转,使得断点在 \(s_1, s_n\) 之间。这条件等价于 \(\left\{\alpha s_1 + \beta \right\} < \left\{\alpha s_n + \beta \right\}\)。因此可以知道,确定 \(\alpha\) 后,满足条件的 \(\beta\) 所组成的区间的长度为 \(\left\{(s_1 - s_n)\alpha \right\}\)。这是好算的。
当断点在两个点之间移动时,计算 \(\beta\) 的取值集合大小是简单的。\(\beta\) 所组成的区间的长度是以 \(\alpha\) 为自变量,\((s_1 - s_n)\) 为斜率的一次函数,我们只需要对它做一次积分即可。
考虑到断点的移动会跨越点,需要将最终需要做积分的函数视为分段一次函数,考虑如何计算分段点。对一个 \(i\),位置 \(\alpha\) 因为它而成为分段点当且仅当 \(\exists k, \ \alpha = \dfrac{k}{|s_{i + 1} - s_i|}\),实际意义就是这个点对应的值 \(\pm 1\)。可以发现,总共有 \(O(\sum_{i} |s_{i + 1} - s_i|)\le O(\sum_{i} s_{i + 1} + s_i) = O(S)\) 个分段点。
我们直接计算分段点并排序,相邻两个点间的积分值是好求的,因此直接写可以做到 \(O(S\log S)\) 的复杂度。
最后我们要证明 \(c\) 收敛于区域 \(D\) 的面积。
对区域 \(D\subset \mathbb R^2\),记 \(\lambda(D)\) 为 \(D\) 的勒贝格测度,即 \(D\) 的“面积”;\(D^{\circ}\) 为 \(D\) 的内部(interior),\(\overline D\) 为 \(D\) 的闭包(closure)。并定义关于 \(D\) 的指示函数 \(I_D\),\(I_D(x) = 1\) 当且仅当 \(x\in D\)。
我们将证明的是以下结论:
设 \(D\subset \mathbb R^2\) 是有界集,且其边界的测度为 \(0\),即 \(\lambda(D^{\circ}) = \lambda(\overline D)\)。令 \(g(k)\) 为满足 \((a/k, b/k)\in D\) 的整数对 \((a, b)\) 的数量。有
\[\lim_{k\to\infty} \frac{g(k)}{k^2} = \lambda(D) \]
我们接下来将定义三个精度为 \(k\) 的指示集合 \(A_k, A_k^{\circ}, \overline{A}_k\)。形式化地,有
- \(A_k = \left\{(a, b)\mid ka\in \mathbb Z, kb\in \mathbb Z, (a, b) \in D\right\}\)
也就是上面的条件,但是倒过来统计 \((a/k, b/k)\)。容易知道 \(g(k) = |A_k|\)。 - \(A_k^{\circ} = \left\{(a, b)\mid ka\in \mathbb Z, kb\in \mathbb Z, [a, a + \frac{1}{k})\times [b, b + \frac{1}{k}) \in D^{\circ}\right\}\)
放在二维平面上,\((a, b)\) 在集合内当且仅当其左上角一个长宽为 \(\frac{1}{k}\) 的空间均被包含在 \(D\) 的内部中。 - \(\overline{A}_k = \left\{(a, b)\mid ka\in \mathbb Z, kb\in \mathbb Z, [a, a + \frac{1}{k})\times [b, b + \frac{1}{k}) \cap \overline D\neq \varnothing\right\}\)
放在二维平面上,\((a, b)\) 在集合内当且仅当其左上角一个长宽为 \(\frac{1}{k}\) 的空间和 \(D\) 的闭包有交。
容易发现的是,\(A_k^{\circ} \subset A_k \subset \overline{A}_k\)。
在 \(A_k^{\circ}\) 和 \(\overline{A}_k\) 的定义中,我们把一个点看做了一个长宽为 \(\frac{1}{k}\) 的空间。因此,\(A_k^{\circ}\) 和 \(\overline{A}_k\) 实际上描述的是 \(\mathbb R^2\) 的一个子空间,我们也需要再定义两个关于 \(A_k^{\circ}\) 和 \(\overline{A}_k\) 的、指示其所对应区域的指示函数。我们定义 \(P_k^{\circ}\) 和 \(\overline{P}_k\) 分别为 \(A_k^{\circ}\) 和 \(\overline{A}_k\) 的类指示函数,形式化地有
- \(P_k^{\circ}(x) = 1\) 当且仅当 \(x \in \bigcup_{(a, b) \in A_k^{\circ}} [a, a + \frac 1k] \times [b, b + \frac 1k]\)。
- \(\overline{P}_k(x) = 1\) 当且仅当 \(x \in \bigcup_{(a, b) \in \overline{A}_k} [a, a + \frac 1k] \times [b, b + \frac 1k]\)。
由于 \(A_k^{\circ},\overline{A}_k\) 中每个元素实际上对应了一个大小为 \(\dfrac{1}{k^2}\) 的空间,以下的结论是不言而喻的:
最后的一块拼图需要存在极限。可以发现,如果精度 \(k\to \infty\),一个二维点 \((a, b)\) 所对应的空间趋向于 \(0\)。这也表明,在 \(k\to \infty\) 的过程中,类指示函数将趋近于指示函数。这也指出了以下的结论:
由于指示函数的性质,我们很容易找到它的控制函数。因此根据勒贝格控制收敛定理,我们能得到
同理可知
由 \(A_k^{\circ} \subset A_k \subset \overline{A}_k\) 与 \(\lambda(D^{\circ}) = \lambda(\overline{D})\),并根据夹逼定理可知
这也就完成了证明。
以下是博客签名,与正文无关。
请按如下方式引用此页:
本文作者 joke3579,原文链接:https://www.cnblogs.com/joke3579/p/chitchat230325.html。
遵循 CC BY-NC-SA 4.0 协议。
请读者尽量不要在评论区发布与博客内文完全无关的评论,视情况可能删除。