UOJ Logo Rainbow_sjy的博客

博客

UOJ NOI Round #9 公告

2025-06-29 23:18:02 By Rainbow_sjy

转眼间又是一年 NOI 了,为了帮大家备战 NOI,延续 UOJ 的传统保留项目,UOJ NOI Round #9 将在 7 月 6 号到 7 月 8 号隆重举行!

比赛主题还在写。

比赛时间

笔试模拟将于 7 月 6 日晚 19 点开始,将进行半个小时。

Day 1 的比赛将于 7 月 7 日上午 8 点半开始,将进行五个小时,共三道题。

Day 2 的比赛将于 7 月 8 日上午 8 点半开始,将进行五个小时,共三道题。

比赛难度

比赛的难度将和 NOI2003 相近,相信对绝大部分选手来说题目是具有一定的挑战性的。

题目中可能拥有若干道非传统题(可能包括但不限于交互题、提交答案题、通信题),大家可以放心食用。

出题阵容

拯救这一年度的 UNR 的出题人将在笔试结束后公布。各位可以先行无奖竞猜出题人的名单。

这场比赛除笔试外将计入 rating。

我们相信这场比赛,可以给拼搏于 AK NOI 的逐梦之路上的你,提供一个有力的援助。

比赛奖项

这次比赛将会根据三次比赛的总分进行排序(如果存在同分将以两天的罚时总和作为第二关键字),其中比赛的前三十名将成为这次训练的金牌得主,第三十一名到第一百二十名将获得银牌,第一百二十一名到第二百名将获得铜牌。(得奖人数将根据参赛人数进行调整)

总分前三名将获得 UOJ 萌萌哒的撕烤熊抱枕一只。

UOJ Round #31 题解

2025-06-29 23:02:16 By Rainbow_sjy

决战库尔斯克

idea, solution, std by Graygoo_401, solution' by return20071007, zhoukangyang, data by Graygoo_401, Rainbow_sjy.

考虑把序列最大值 $mx$ 求出来,按照是否严格大于 $mx \over 2$ 分成两部分,分别称为 $A$ 和 $B$。$A$ 内部的答案显然为其极差,$B$ 内部的答案可以递归下去求,考虑怎么求出两部分之间的贡献。

设 $A$ 的极差为 $d$,对于一个 $v \in B$,如果有 $v \leq d+1$,则它不会更新答案;否则容易发现 $A$ 中元素对 $v$ 做除法后最多得到两种商,枚举商统计贡献即可。

这样子得到 $O(n \log n \log V)$ 解法,由于常数很小足够通过。

以上做法存在更简洁形式:排序后直接倒着扫,如果当前数已经小于答案则退出,否则每次暴力向后枚举所有可能的商。容易发现这个东西和上面做法等价。

以下介绍一个来自 UT 老师的确定性 1log 做法。

假设现在反扫到 $A$,遇到了 $x=XA+A-U$ 和 $y=(X+1)A+V$ 需要二分其分界点,其中 $0\lt U\le A$,$0\le V\lt A$。根据经典结论有 $y-x\lt A$。

取 $y\lt z\le\frac{xy}{y-x}(1-\frac Ax)=\frac{y(x-A)}{y-x}$,则 $\frac zx-\frac zy=1-\frac 1X\lt1$,于是 $\lfloor\frac zx\rfloor=\lfloor\frac zy\rfloor$ 或 $\lfloor\frac zx\rfloor=\lfloor\frac zy\rfloor+1$。

如果 $\lfloor\frac zx\rfloor=\lfloor\frac zy\rfloor+1$,设 $z=xa+p=y(a-1)+q$,其中 $a=\lfloor\frac zx\rfloor$,则 $z\bmod y=q$。注意到此时 $x\le x+p=(y-x)(a-1)+q\le(y-x)\times\frac zy+q=x(1-\frac Ax)+q$,于是 $q\ge A$。但我们的 $A$ 被反扫到而非直接剪枝,矛盾!

所以不可能出现这种情况。于是区间内的所有 $z$ 都满足 $\lfloor\frac zx\rfloor=\lfloor\frac zy\rfloor$。设 $z=xa+p=ya+q$,其中 $a=\lfloor\frac zx\rfloor$,那么 $z\bmod x=p=(y-x)a+q$。由于 $A$ 没有被剪枝,可知 $p\lt A$,也即 $(U+V)a+q\lt A$。于是 $0\le Va+q\lt A-Ua\le A-U=x\bmod A$。同时注意到 $z=ya+q=Va+q+(X+1)Aa$,于是 $z\bmod A=Va+q\le x\bmod A$,我们可以直接跳过这部分 $z$。

总而言之,我们接下来可以一直无视直到 $z\ge\frac{xy}{y-x}(1-\frac Ax)\gt(X^2-1)A$。那么对于一个固定的 $A$ 和值域 $W$,只需要二分 $O(\log\log V)$ 次。

如果直接进行二分,复杂度为 $O(n \log n \log \log V)$。

但是众所周知地,整数后继存在 $\log \log V$ 求法。不过如果需要严格确定性,这里就不能上传统 y-fast trie 的哈希表,我们需要字典树上预处理一个点按照某种轨迹连走 loglog 步的结果,这样在字典树上定位的复杂度即降到 $O({\log \over \log \log}+\log \log)$,后面同正常即可。

除 UT 做法以外,我们还有一个来自于 zak 的非确定性 1log 以及一些不会证也不会卡的做法(二进制分组,但是先去重并且能不二分(只有一个商)就不二分,详见 std 代码),如果有大神会证或卡了可以教教我。

决战尘雨巷

idea by Coffee_zzz, solution by return20071007, std,data by Milmon.

算法零

对于子任务 1,只需要一开始做反转,然后不断向同一个方向走,直到遇到 $1$ 为止,此时走的步数即为 $n$。

算法一

考虑倍增,假设当前已经确定 $n > 2^{k - 1}$,现在需要处理 $2^{k - 1} < n \leq 2^k$ 的情况。比较简单的做法是,不断朝一个方向走 $2^k$,记录这些位置的值,然后反转下一个位置,再走回来并查询新值,如果发现与原先的值不一样,那么反转位置与该位置的差即为 $n$。花费的代价是 $\mathcal{O}(n)$ 的,但是常数较大。b16.gif

添加如下优化:

  • 注意到一轮结束后,总是已知一个区间并且当前位于区间的一个端点处,于是只需要朝另一个方向继续走并记录值即可;
  • 最后查询新值时,由于已经确定 $n > 2^{k - 1}$,所以前 $2^{k - 1}$ 个位置不需要查询。

这样一轮花费的代价为 $2.5 \times 2^k$,所以比值最大时约为 $8$(需要注意找到 $n$ 之后剩下的部分不需要继续走,并且比值在 $n = 2^k + 1$ 时取到极值)。

然而事实上以 $2$ 为基数倍增并不是最优的,具体地,有两种可行的优化方法:

  • 设倍增基数为 $k$,则比值为 $\frac{k (4k - 3)}{k - 1} - 2(k - 1) = \frac{2k^2 + k - 2}{k - 1}$,在 $k = 1 + \frac{1}{2} \sqrt{2}$ 时取到最大值 $5 + 2 \sqrt{2}$;
  • 可以直接 DP 出每次倍增最优的分界点,在 $n \leq 2 \times 10^3$ 的限制下最优比值约为 $7.5$。

这两种方法都可以通过子任务 2。

算法二

设初始位置为第 $0$ 个位置,向后移动的过程中,维护“第 $0$ 个位置为 $1$,其余位置均为 $0$”的状态以及一个候选答案。具体地:

  • 若当前走到第 $i$ 个位置并且值为 $1$,那么反转当前位置,并且标记 $i$ 为一个可能的答案;若 $i$ 是答案,那么必须满足接下来 $i$ 个位置均为 $0$,我们将在 $2i$ 处检验这个答案,而之前的候选答案未被检验,可以舍弃。
  • 如果值为 $0$ 什么都不用做。除非现在到达了候选的答案 $x$ 的两倍处,此时需要反转当前位置并往回走 $x$ 步,检验位置 $x$ 是否变为 $1$。如果是则确认答案为 $x$,否则答案被舍弃,走回 $2x$ 并把 $2x$ 反转为 $0$ 即可。

这样会在走到 $2n$ 时得出答案,走的过程加上查询位置共 $4n$,检验答案时所有 $[x + 1, 2x]$ 形成若干个不相交的区间,长度总和不超过 $2n$,代价共 $4n$。而最后得出答案之后不需要走回去,可以节省 $n$ 的代价,故比值最大为 $7$,大约可以得到 $65$ 分。b13.gif

算法三

调整算法二。假设当前已经维护第 $p$ 个位置为 $1$,而 $0 \sim p - 1$ 均为 $0$,并且已知答案 $> p$。每次找到下标 $> 2p$ 的第一个 $1$ 所在的位置 $p'$,若答案 $\leq p'$,则答案一定正好是 $p' - p$。反转并往回走到 $p$ 处检查即可,返回 $p'$ 时将中间这一端全部置为 $0$ 即可。

这部分总代价为 $4(p' - p)$。而得出答案后不需要走回去并且清空,所以总代价为 $6n + \mathcal{O}(\log n)$,大约可以得到 $86$ 分。

算法四

基于算法一优化。在算法一基础上,倍增过程中记一个 $B$,并且设倍增到 $2^k$,改为维护 $\frac{2^k}{B}$ 个位置的值,维护的相邻两个位置距离为 $B$,这样一个长度为 $2^k$ 的部分每 $B$ 个就有一个位置被记录。

修改时先走到序列的左侧一端,令这一端外连续 $B$ 个位置反转,再向右走遍历序列,在记录值的位置处检验值是否被修改,若被修改,那么就可以得到一个 $n$ 的大小为 $B$ 的范围。在此基础上为了快速确定 $n$ 的值,还需要将反转的 $B$ 个位置的右侧 $B$ 个位置修改为 $1, 0, \cdots, 0$ 作为标识,这样找到一个记录的值被反转时,只需要查询接下来 $2B - 1$ 个值,其中的标识一定是唯一的。

算法一中提到的优化仍然可以保留。那么已知 $n > 2^{k - 1}$,检验 $[2^{k - 1} + 1, 2^k]$ 区间内是否有答案的过程需要 $1.5 \times 2^k + \mathcal{O}(B + \frac{2^k}{B})$ 的代价。

$B$ 的值需要随着倍增过程动态调整,但是需要注意 $B$ 只能整倍数增加,否则会存在新的位置需要记录。总代价为 $5n + \mathcal{O}(B + \frac{n}{B})$(注意找到 $n$ 之后后面会省去一部分代价)。维护 $B = \mathcal{O}(2^{0.5k})$ 时代价即为 $5n + \mathcal{O}(\sqrt{n})$。b12.gif

但是 $\mathcal{O}(\sqrt{n})$ 部分常数比较大 b51.gif,所以在子任务 3 中对 $n$ 较小时放宽了比值要求。b06.gif

另外一种思路是维护一个每隔 $B$ 个就固定有一个 $0$ 的序列,走到序列一端后向外连续 $B$ 个位置均修改为 $1$,这样往回走的时候也能找出 $n$ 的范围;然后额外在 $1$ 后面加一个 $0$ 用来定位准确的 $n$。代价大约是 $6n$,调整倍增分界点可以更优一些。

决战中途岛

idea, solution, std, data by pp_orange

题解一

我们称 $y\ge |x|$ 的区域为可行区域。

我们“桶翻”和“机动”两步看做为同一时刻发生的一步,来刻画交替操作。我们注意到出发时距离原点的曼哈顿距离是奇数,所以"桶翻"的时候一定不会翻出可行区域的,我们把两步合并成一步后再把坐标轴旋转 $45$ 度,这样如果我们现在位于 $(p,q)$,飞龙号位于 $(a,b)$,一步内会有 7 种移动:

  • $(p,q)$(2种方案)。

  • $(p-1,q),(p,q+1),(p-1,q+1)$,

  • $(p,q-1),(p+1,q),(p+1,q-1)$

注意此时合法区域变为了 $x\ge 0,y\ge 0$ 。

我们考虑对这个坐标再做一步转化。

我们发现我们现在的游走可以被拆分成 3 个分量,大概用生成函数写出来就是 $(1+x^{-1})(1+y^{-1})(x+y)$,然后中途的时候 $x$ 上的指数和 $y$ 上的指数始终要 $\ge 0$。我们发现 $(1+x^{-1}),(1+y^{-1})$ 只和其中的一个变量有关。

这诱导我们尝试把 $x+y$ 每一轮选什么枚举出来。

我们从 $(0,0)$ 开始画一条折线,每选一个 $x$ 就 $(+1,+1)$,每选一个 $y$ 就 $(+1,-1)$。我们这个时候再考虑 $(1+x^{-1})$ 和 $(1+y^{-1})$ 的约束是什么情况,他们会变成动态约束。但是你发现,大致就是折线向上走,$x$ 的约束变松,$y$ 的约束变严,折线向下走则反过来。我们把 $1+x^{-1}$ 的折线(选 $1$ $(+1,-1)$,选 $x^{-1}$ $(+1,+1)$)画出来,我们发现他应当满足在 $x+y$ 折线的下方,而 $1+y^{-1}$(选 $1$ $(+1,+1)$,选 $y^{-1}$ $(+1,-1)$) 折线应当在 $x+y$ 的上方。这实质上是一个不相交路径的约束!

我们发现最终 $x$ 和 $y$ 上的指数只和最后三个点相邻两者之间的距离有关。我们 $O(h)$ 枚举 $x+y$ 折线最终落在了哪里,然后 $LGV$ 引理计算不相交路径数即可。复杂度 $O(h)$。

题解二

solution by maspy

话不多说,我们直接上图。

0f33c5e0449168cbb14e3fad54c6f079.png

我们把原问题上的若干种转移拉伸缩放一下,画到三角格点的图上,就长这样。注意到这个转移是在任何方向上对称的!

我们如果把这个平面当成我们的 dp 数组的话,我们额外设置 5 个初值点,变成下图:

121a57859fdca9d5e9d5bbfd44c46ff8.png

注意到在 dp 的转移过程中,正数和负数永远会在黑色的边界上抵消,这个黑色的边界会天然形成一个“不可穿越的结界”。但是它并非真的不可穿越,也就是说,我们不需要那个烦人的 $y\ge |x|$ 的约束了!

我们现在只需要用组合数计算一个点在 $h$ 步到另一个点的方案数即可。我们发现这个移动系数实际上可以分解为 $3$ 个分量的独立组合:

image.png

终点的坐标已经给我们带来两个方程,我们只需要枚举其中任意一个分量出现的数量,就可以计算剩下两个分量的出现次数,组合数计算即可。时间复杂度线性。

UOJ Round #31 公告

2025-06-18 20:18:12 By Rainbow_sjy

UOJ Round #31 将于 6 月 29 日星期日晚上 18:00 举行!比赛将进行 4 个小时,共三道题。

这是 UOJ 第三十一场 UOJ Round,还是一如既往的省选及以上难度,欢迎大家来玩!

为了方便阅读,同时也因为管理员比较鸽(lan),这次的 UR 没有特别的主题。

比赛链接:https://uoj.ac/contest/98

出题人:Graygoo_401, Coffee_zzz, return20071007, pp_orange

参加本次比赛将有机会获得 UOJ 抱枕!获奖条件的 SHA256 码是 e4ddd61e479846cb7dd08ec5898581d056b8748ebbf706ed6837fb686fd77c56。比赛结束后将公布条件。

再次提醒大家比赛中途只测样例,最后会进行最终测试,把所有提交记录重测。

广告:Cfz 出题组火热招人中!有意者请联系 Coffee_zzz(qq:3759713328)。


UPD: 恭喜前 5 名的选手!

  1. maroonrk
  2. hos_lyric
  3. lgvc
  4. liuhengxi
  5. Flamire
"设选手第二题的得分为 s,floor(s) * floor(100*(s-floor(s))) 最大的选手,若有多个相同的则取排名最高的。"
SHA-256 : e4ddd61e479846cb7dd08ec5898581d056b8748ebbf706ed6837fb686fd77c56

恭喜 liuhengxi 获得 UOJ 抱枕!

UOJ Round #30 题解

2025-05-10 23:53:45 By Rainbow_sjy

赛场设计

idea, solution, std, data by pp_orange

我们称“ $a$ 不能到达 $b$,$b$ 不能到达 $c$,$c$ 不能到达 $a$”为反三元环。

由于图是一个 DAG,所以对于任意一对节点 $(u,v)$ 必然有 $u$ 不能到 $v$ 和 $v$ 不能到 $u$ 中的至少一个。如果我们建立一张新图,把所有不可达关系全部画到这个图上,我们会发现这个图比竞赛图还密集。一些竞赛图的结论在这个图上仍然成立:

1、我们把这个图缩点之后会形成一个链。

2、这个图大小 $\ge 3$ 的 SCC 一定存在三元环。也就是原题中的反三元环

所以缩点后一定会形成一个每个 SCC 大小都小于等于 $2$ 的链结构。

考虑设计 $dp[i][j]$ 表示一共放了 $i$ 个点,链最后一层有 $j$ 个点的方案数,其中 $1\le j\le 2$,我们考虑先把 $i!$ 除掉,最后再乘回去即可,转移如下:

$$ dp[i+1][1] \gets dp[i][1]\times2^{i-1} + dp[i][2]\times2^{i-2} $$

$$ dp[i+2][2] \gets dp[i][1]\times2^{2(i-1)} + dp[i][2]\times2^{2(i-2)} $$

事实上我们还可以更进一步,把 $2^{\frac{i(i-1)}{2}}$ 也除掉,这样转移就是常系数的线性齐次转移了,可以用矩阵乘法优化。当然,在这个题没有必要,我们的瓶颈在于求阶乘。

这个题还有一些从最长反链 $\le 2$,于是最小链覆盖小于等于 $\le 2$ 的角度来刻画这个结构的,这里不多赘述。部分分设计主要为了一些指数级、高次多项式复杂度和固定模数算法。

最后复杂度为 $O(n)$ 或 $O(\sqrt n \log n)$(快速阶乘算法)。

交通管制

idea, solution, std, data by chenxinyang2006

考虑这样一个问题:假设给原图所有子集 $S \subseteq U$ 均赋了权重 $a_S$,并定义一张连通子图的权值是其所有边双对应的 $a$ 之积,并且我们还已经对所有 $S$ 知道了 $S$ 的边双连通边子图数量是 $b_S$,如何求原图所有边子图的权值和。

如果已经确定的边双给出的对 $U$ 的集合划分,把每个边双缩为一个点后,这一方案的 $a$ 之积是确定的,各个边双内部的连边方案数是对应的 $b$ 也是确定的,而边双之间的连边方案数相当于做生成树计数。不过如果这样看待问题并不好优化。

我们分阶段考虑这个问题,设 $p_0 \sim p_n$ 是 $n$ 个集合幂级数,$(p_i)_S$ 表示 $S$ 的导出子图的所有满足 只存在两端编号最大值不超过 $i$ 的割边 的边子图的权值和。最后希望计算 $p_n$,而 $p_0$ 因为不允许出现割边, $(p_0)_S=a_Sb_S$。

考虑 $p_{u-1} \to p_u$ 的变化:现在允许点 $u$ 的邻边有割边(但边的另一侧编号仍需 $ < u$)。如果将所有两端编号最大值为 $u$ 的割边断开,这张边子图将会分裂成若干连通块,根据连通块给出的点集划分设 $S = P \cap T_1 \cap T_2 \cap ... \cap T_k$,其中 $u \in P$,所有 $P,T_i$ 两两无交。那么这张边子图在所有 $P$ 或 $T_i$ 的部分都符合 $p_{u-1}$ 的限制,这是递归到子问题的形式,并且这个划分当然是唯一的。

于是要计算 $(p_u)_S$ 只需枚举 $S$ 像这样的集合划分,对应的所有边子图权值和是 $(p_{u-1})_P \prod\limits_{i=1}^k (p_{u-1})_{T_i} cof(u,T_i)$,其中 $cof(u,T_i)$ 表示选一个 $v \in T_i,v < u$ 新连上 $(u,v)$ 这条子图中的割边的方案数,其实也就是原图中 $u$ 与多少在 $T_i$ 内且编号小于自己的点有连边。

那么设 $(q_{u-1})_S=[u \notin S] (p_{u-1})_S \cdot cof(u,S)$,在只考虑 $u \in S$ 的项的意义下,$p_u=p_{u-1} \times (\exp q_{u-1})$。注意若 $u \notin S$ 那么上述分析其实都无效,但当然 $(p_u)_S=(p_{u-1})_S$。

于是计算 $n$ 次集合幂级数 exp 以及子集卷积即可解决上述问题。

称该由 $p_0$ 计算 $p_n$ 的操作为 “边双连通-连通变换”。


接下来考虑 数边双连通子图,注意在上述问题中若取所有 $a_S=1$,计算出的 $(p_n)_S$ 应为 $S$ 导出子图的连通边子图数,这可以 $\Theta(2^nn^2)$ 计算。注意上述过程是可逆的,知道 $p_i$ 同样只需进行一次集合幂级数 exp 和一次子集卷积即可求出 $p_{i-1}$。于是逐步倒推,在已知 $p_n$ 的前提下进行 $n$ 次集合幂级数 exp 以及子集卷积可以倒推得到 $p_0$,称为反向的 “边双连通-连通变换”。


对于本题,限制相当于是一些点对必须连通,以及一些点对的边简单路径必须不唯一。方便起见我们先假定要求选出的边子图连通。

注意到若一个点对已经连通,其间的边简单路径唯一充要于将每个边双缩为点之后,在得到的边双树上两个点简单路径上经过的边双大小均为 $1$。那么对于确定的边双树,称大小 $>1$ 的边双为黑点,大小 $=1$ 的边双为白点,$u,v$ 间只存在一条边简单路径当且仅当它们所属同一个极大白色连通块。

一张边子图根据极大白色连通块和黑色点给出了对原图点集 $U$ 的划分 $U=P_1 \cup P_2 \cup ... \cup P_m \cup Q_1 \cup Q_2 \cup ... \cup Q_k$。$P_i$ 对应极大白色连通块,$Q_i$ 对应一个大小大于 $1$ 的边双。

那么 $c_i=2$ 的限制相当于说不能出现某个 $P_i$ 满足存在限制 $(s_j,t_j,2)$ 且 $s_j,t_j \in P_i$。假设一张边子图给出的对 $U$ 的划分确定,可以据此判断其是否合法。

假设划分确定,某个 $P_i$ 内部的连边数相当于这个点集导出子图的生成树计数,直接使用矩阵树定理计算是 $\Theta(2^nn^3)$ 的,其实也可以 $\Theta(2^nn^2)$ 不过不重要。某个 $Q_i$ 内部的连边数即数边双连通子图,可以 $\Theta(2^nn^3)$ 全部计算出。

之间的连边还是把一个 $P_i,Q_i$ 缩成一个点之后相当于做生成树计数。但注意因为要求 $P_i$ 是极大的,不能将两个极大白色连通块相连!

回忆经典题 “$n$ 种颜色的小球第 $i$ 种有 $a_i$ 个,有多少种排列小球的方式使得没有同色小球相邻” 是如何解决的:容斥枚举一些小球对同色且相邻。这两个问题非常类似,因此处理这一限制也可以考虑容斥。

把连边看作两个阶段:第一阶段只能在 $P_i$ 间连边,连边边权为 $-1$,第二阶段可以任意连边,连边边权为 $1$。

那么对于连出来边集一致(忽略边权)的一些生成树,假设其将两个极大白色连通块相连,这条边既可以在第一阶段连也可以在第二阶段连,因此权重抵消了。

于是设 $f'_S$ 表示 $S$ 导出子图生成树计数,$f_S=f'_Svalid(S)$,$valid(S)$ 表示 $S$ 是否能作为一个极大白色连通块,$g_S$ 表示 $S$ 导出子图的边双连通边子图数量。设 $transfer(F,c)$ 为将 $F$ 进行每额外选一条割边贡献乘上 $c$ 的正向 “边双连通-连通 变换” 后得到的集合幂级数。原问题的答案是 $transfer(transfer(f,-1)+g,1)_U$。


原问题未必要求选出的边子图连通,注意到 $transfer(transfer(f,-1)+g,1)$ 相当于对所有 $S \subseteq U$ 计算了 $S$ 导出子图中有多少连通边子图满足所有 $(s_j,t_j,2)$ 的限制,只要 $s_j,t_j \in S$。原图任意的边子图根据连通块给出了对 $U$ 的点集划分,一些划分出来的点集可能不满足连通性限制,对所有满足连通性限制的点集的答案做 exp 即可。

时间复杂度 $\Theta(2^nn^3)$。更劣的 $\Theta(3^nn)$ 在此数据范围下无法区分,也可通过。


如果有疑惑,更详细的分析以及一些背景知识介绍见 apio2025 我的讲课。

百里马拉松

idea, solution, std, data by _LHF_

本题标算为 $O(\frac{n\log n}{\log \log n})$,然而出题人因为水平问题无法区分该做法和 $O(n\log n)$ 的做法,出题人在此谢罪。

建议先阅读论文《浅谈树上邻域问题的一种基于长链剖分的解法》。

考虑对树进行长链剖分,

首先对于一个询问 $(x,d)$,如果 $x$ 的高度 $\ge d$,那么 $(fa_x,d)$ 和 $(x,d)$ 结果相同,此时不妨令 $x\to fa_x$,不断这么做直到不能这么做位置,该过程可以用倍增做到 $O(\log n)$。

简单转化一下,相当于是每条长链都挂了一条额外链,然后只需要处理所有挂在这个长链上的询问。

对于处理该长链子树外部贡献的方法,详见我的论文。

找到 $(x,d)$ 左侧和右侧第一个碰到的点,然后考虑将询问拆成三个部分,中间那部分直接二区间合并分治即可,这样可以做到三次合并解决。

然后可以类似我在营员交流中提到的技巧,改成一次合并,总复杂度仍然是 $n\log n$,不过常数过大,所以无法接受。

事实上我们可以将该问题转化为一个树上祖先后代链查询的问题,具体来说,对于一条额外链,我们把每个位置都看成一个点,然后类似论文中“强制在线处理方法”连边,转化成树上链查询问题,用树上二区间合并分治即可。

实际上还能做得更好,考虑倍增分块,对于长度为 $len$ 的额外链,找到最小的 $b$ 满足 $B^b\ge len$,然后将该额外链的长度扩充到 $B^b$。这样本质不同的额外链长度数量就不超过 $\log_Bn$ 条了,可以直接暴力枚举跳到了哪一个长度上,标算实现是 $O(n(2B+\log_B n+C))$,其中 $C$ 是一个和 $n,B$ 无关的常数。

然后我们简单处理一下即可,$B=2$ 时复杂度为 $O(n\log n)$。

注意到 $B$ 不一定要取到 $2$,当 $B$ 取到 $(\log n)^{eps}$ 时理论复杂度为 $O(\frac{n\log n}{\log\log n})$。然而该做法常数较大,所以出题人几乎无法区分该做法和 $O(n\log n)$ 的做法。

如果有人有更优的做法,欢迎和出题人联系。

UOJ Round #30 公告

2025-05-01 20:43:02 By Rainbow_sjy

UOJ Round #30 将于 5 月 10 日星期六晚上 18:00 举行!比赛将进行 4 个小时,共三道题。

这是 UOJ 第三十场 UOJ Round,还是一如既往的省选及以上难度,欢迎大家来玩!

公元 1997 年 5 月 10 日,第二届东亚运动会在韩国釜山盛大开幕,而在遥远的跳蚤大陆,一场同样激烈的竞争正在悄然酝酿——跳蚤国运动会即将拉开帷幕!

近年来,跳蚤国运动会中最引人瞩目的项目,莫过于“马拉松”——一项考验选手毅力与耐力的极限挑战。过去十年间,跳蚤国的马拉松赛场一直被“闪电跳蚤”战队统治,他们的持久奔跑与无懈可击的战术让对手望尘莫及,连续多届包揽金牌。

然而,就在本届运动会前夕,一支来自跳蚤大陆东部的新锐队伍——“量子跳蚤”战队横空出世。他们凭借独创的能量补充策略与精准的步伐调节,在预选赛中一路碾压传统强队。他们的队长,一位年仅 17 岁的天才选手,放言要在正赛中彻底终结“闪电跳蚤”的王朝。

一边是经验丰富的传奇战队,一边是锐不可当的新生力量,这场马拉松的巅峰对决,究竟会如何收场?

这一场比赛将围绕这次较量展开。

比赛链接:https://uoj.ac/contest/97

出题人:pp_orange, chenxinyang2006, _LHF_

参加本次比赛将有机会获得 UOJ 抱枕!获奖条件的 SHA256 码是 50fe342ae39d357f4c32218ee9ebee506d92ab7098315e357f23b6f61c850aba。比赛结束后将公布条件。

再次提醒大家比赛中途只测样例,最后会进行最终测试,把所有提交记录重测。


UPD: 恭喜前 5 名的选手!

  1. hos_lyric
  2. Nesraychan
  3. Z_301
  4. Kevin090228
  5. lgvc
每题的得分乘以得分时间,三题加和最大的人
50fe342ae39d357f4c32218ee9ebee506d92ab7098315e357f23b6f61c850aba
2       Nesraychan       17116960
6       JohnAlfnov       16276855
4       Kevin090228      16196385
22      syx2567          15177815
8       nullptr_qwq      14694500

恭喜 Nesraychan 获得 UOJ 抱枕!

Rainbow_sjy Avatar