#5519. 云斗学院 2025 年国赛前公益训练营训练赛 #2 题解

云斗学院 2025 年国赛前公益训练营训练赛 #2 题解

当前没有测试数据。

A

QOJ8593 难度 2

首先,我们在最终的图中找到一个拓扑序,然后对这个排列做一下置换。下面我们钦定每次给出的 x,yx,y 都满足 x<yx<y;一个数 xx 当前能被确定,当且仅当它能到达 x1x-1 个点,且有 nxn-x 个点能到达它。

我们考虑 x1x-1,发现他必须得能从 xx 直接到达;进一步考虑 x2x-2,发现它的入边里面至少得有 x1x-1xx

依此类推,我们可以发现,如果设 aia_i 表示 ii 的入边中编号最小的点,那么 xx 能到达 1,2,,x11,2,\cdots,x-1,当且仅当对所有的 i=1,2,,x1i=1,2,\cdots,x-1,都有 aixa_i\le x。同理设 bib_i 表示 ii 的出边中编号最大的点,那么还需要对所有的 i>xi>x,都有 bixb_i\ge x

每次修改对 a,ba,b 的影响是 O(1)O(1) 的,简单用线段树维护下就行。时间复杂度 O((n+m)logn)O((n+m)\log n)


B

LOJ3687 难度 2

首先,当 i<ji<j 时,TiTjT_i\le T_j 等价于 s[i+1,j]s[i,j1]s[i+1,j]\le s[i,j-1]

也就是说,区间 [i,j1][i,j-1] 内第一个满足 sksk+1s_k\neq s_{k+1} 的位置 kk 需要满足 sksk+1s_k\ge s_{k+1}

另一方面,如果 i>ji>j,那么相当于区间 [j,i1][j,i-1] 内第一个满足 sksk+1s_k\neq s_{k+1} 的位置 kk 满足 sksk+1s_k\le s_{k+1}

i<ji<j 的限制 TiTjT_i\le T_j 为第一类约束区间 [i,j1][i,j-1],否则为第二类约束区间 [j,i1][j,i-1]

直接记录 f(i,j)f(i,j) 表示前 ii 个字符,si=js_i=j 的方案数。转移时,我们分三种情况讨论:

  • si=si+1s_i=s_{i+1}:此时没有约束,直接转移 f(i,j)f(i+1,j)f(i,j)\to f(i+1,j)
  • si>si+1s_i>s_{i+1}:枚举上一个 sksk+1s_k\neq s_{k+1} 的位置 kk,那么要求 ii 能满足所有 l>k,ril>k,r\ge i[l,r][l,r] 的约束,也就是不能存在第二类约束区间,满足 k<li,rik<l\le i,r\ge i。合法的 kk 是一段后缀,可以拿 set 简单维护得到这段后缀。得到合法后缀之后有 f(k+1,j)f(k,j)f(i+1,[x<j])f(k+1,j)-f(k,j)\to f(i+1,[x<j]),可以简单做到 O(1)O(1) 转移。
  • si<si+1s_i<s_{i+1}:类似。

综上,总复杂度 O(nΣ+nlogn)O(n|\Sigma|+n\log n),其中 Σ=26|\Sigma|=26


C

ARC148E 难度 3

考虑把数分成 K2\ge\frac{K}{2}<K2<\frac{K}{2} 的,那么 <K2<\frac{K}{2} 的一定不能相邻,K2\ge\frac{K}{2} 的一定可以相邻,而如果分别再两边,那么 x,yx,yx<K2yx<\frac{K}{2}\le y) 可以相邻当且仅当 x+yK    K2xyK2x+y\ge K\iff \frac{K}{2}-x\le y-\frac{K}{2}

于是我们按照 xK2|x-\frac{K}{2}| 从大到小的顺序插入每种数(如果有 x+y=Kx+y=K 那么我们先插入大的)然后把方案数乘起来即可。具体来说我们分类讨论一下插入的这个数 xxK2\ge \frac{K}{2} 还是 <K2<\frac{K}{2},设其个数为 yy,维护满足当前两边都是 K2\ge \frac{K}{2} 的数这样的空隙个数 ss,那么

  • 如果 xK2x\ge \frac{K}{2},那么 xx 只能和 K2\ge\frac{K}{2} 的数相邻。不难发现不管怎么插入,空隙的个数一定只会增加 yy。于是方案数是 (s+y1y)\binom{s+y-1}{y},然后我们令 ss+ys\leftarrow s+y
  • 如果 x<K2x<\frac{K}{2},那么 xx 可以放在任意一个空隙里面,不难得到方案数为 (sy)\binom{s}{y},然后插入一个肯定会减少一个空隙,所以需要把 ssys\leftarrow s-y

总复杂度 O(nlogn)O(n\log n),瓶颈在排序。


D

LOJ2472 难度 3

考虑依次给 i=1,2,,ni=1,2,\cdots,n 填上数,每次尽量填最大的。考虑什么时候 ii 填上 xx 是合法的。考虑 Hall 定理,发现左部点约束最严的时候肯定是找一个已经填过的点 uu,然后对所有 dvdud_v\ge d_uvv,选出 vv 的子树内的所有点,也就是说我们会选一个后缀的子树的并。形式化地,对每个已经填过的点 uu,所有 dvdud_v\ge d_uvv 的子树内未填的点并起来的大小不能超过 du\ge d_u 且尚未被填入的格子个数。

维护 wiw_i 表示如果在判定中选择分界点为 iii\ge i 的剩余空位数减去所有 duid_u\ge i 的子树并中未填点数的差,那么当前状态合法当且仅当 wi0w_i\ge 0 对所有 ii 成立。

考虑给 uu 填入 xx 有什么影响,发现对前一项的影响是所有 ixi\le xwiwi1w_i\leftarrow w_i-1。考虑后一项会发生什么变化,我们发现由于树的 BFS 序就是 1,2,,n1,2,\cdots,n,因此 uu 的子树内一定完全是空的,祖先一定是满的。因此,设 vvuu 的父亲,显然只有 ixi\le xwiw_i 会发生改变,具体地:

  • idvi \le d_v 时这个子树并中未填的点的个数会 1-1,导致实际的 wiw_i 不改变;
  • dv<ixd_v<i\le x 时,子树并会多出 sizeu1\text{size}_u-1,导致实际的 wiw_i 的变化为 wiwisizeuw_i\leftarrow w_i-\text{size}_u

因此,实际的影响就是:对所有 dv<idud_v<i\le d_u,令 wiwisizeuw_i\leftarrow w_i-\text{size}_u。那么要想维持 wi0w_i\ge 0,就只需要找到 dvd_v 后面的最大的 xx,使得对 i(dv,x]i\in (d_v,x],均有 wisizeuw_i\ge \text{size}_u,然后将这个区间都减去 sizeu\text{size}_u。线段树维护即可,时间复杂度 O(nlogn)O(n\log n)


E

LOJ6669 难度 3

首先指出本题我们需要的两个工具:

  • 询问每个点 uu11 的距离就可以知道每个点的深度 depu\text{dep}_u
  • 接下来,如果我们已经确定了 uu 的每一级祖先,询问 d(u,v)d(u,v) 即可得到 LCA(u,v)=z\text{LCA}(u,v)=z 的深度(具体地,depz\text{dep}_z 满足 $\text{dep}_u+\text{dep}_v-2\times \text{dep}_z=d(u,v)$),进而得到 LCA(u,v)\text{LCA}(u,v)

考虑按照 BFS 序,即深度从小到大的顺序构建整棵树,并维护这棵树实时的轻重链剖分结果。

加入一个新一层的点 uu 时,我们先找到 11 所在重链的链底 xx,找到 LCA(u,x)=y\text{LCA}(u,x)=y。如果 y=xy=x,说明 uu 的父亲就是 xx,我们就确定了 uu 的父亲;否则,uu 一定在 yy 的另一个子树内(注意树是二叉树,因此一定可以确定到底是哪个子树)。这样只会跳 O(logn)O(\log n) 次轻边,可以在 O(nlogn)O(n\log n) 次询问内确定所有点的父亲。

询问复杂度 O(nlogn)O(n\log n),时间复杂度 O(n2)O(n^2)


F


G

QOJ4549 难度 3

f(u)f(u) 表示 uu 子树的 SG 值,那么转移相当于选一个 vv,删掉这条链后必然会形成若干子树,该后继的 SG 值就是这些子树的 SG 值的 xor 和。最后还需要对这些东西取 mex。

考虑所有这些后继状态,发现如果我们设 S(u)S(u) 表示 uu 子树的所有后继状态的 SG 值构成的集合,实际上对于一个点 uu,设其儿子分别为 v1,,vkv_1,\cdots,v_k,那么他的 S(u)S(u) 就是:将每个 S(vi)S(v_i) 异或上所有 jij\neq if(vj)f(v_j),然后再取并集,再插入所有 f(vi)f(v_i) 的异或(表示第一次操作删除了 uu 自己)。

那么我们就是要用数据结构维护一个集合,支持全局异或,插入,合并,查询全局 mex 这三种操作。

使用 01trie 维护即可,单组数据复杂度 O(nlogn)O(n\log n)


H

Luogu5287 难度 4

我们来刻画本题这样的字符串的 border:可以发现,一些后缀段能和一些前缀段构成 border,需要他们除了开头和结尾之外的二元组 (x,c)(x,c) 都完全相同。对于首尾两个二元组,需要后缀的开头段比前缀长,前缀的结尾段比后缀长。

考虑直接把二元组 (x,c)(x,c) 当作字符来进行字符串匹配。我们考虑加入一个 (x,c)(x,c) 对答案的贡献。如果没有撤销操作,我们可以直接暴力跳 fail link 并记录当前遇到的所有节点中 cc 这条出边长度的前缀最大值 w1w_1,每遇到一个更大的 w2w_2,设这里前面的总长度为 LL,我们就给答案加上 i=w1+1w2L+i\sum_{i=w_1+1}^{w_2}L+i;当遇到和 (x,c)(x,c) 完全相同的二元组时停下。时间复杂度和 kmp 相同。

注意 kmp 的复杂度是均摊的,即使我们能够存下所有的版本,也不能在扩展新版本时直接由原版本暴力跳 fail link 扩展而来此时有两种做法。

注意到一个字符串 ss 的所有 border 构成 O(logs)O(\log|s|) 段等差数列,我们考虑利用这一性质优化跳 fail link 的过程。具体来说,我们对当前的 s[1k]s[1\cdots k] 考虑其最长 border,设其为 kdk-d,那么 dds[1k]s[1\cdots k] 的周期。由弱周期引理,所有 kd\le k-d 的数中只有 dd 的倍数是周期(因为弱周期引理需要 p+qsp+q\le |s|),这对应着所有长度 d\ge d 的位置只有形如 kxdk-xd 的位置是 border(并且进一步由于 dd 是周期,这些 border 的下一个字符总是相同的)。

因此我们只需要令 kkmodd+dk\leftarrow k\bmod d+d,即最小的一个 d\ge d 的形如 kxdk-xd 的位置,即可。这里很多地方想要解释 +d+d 的原因,但实际上注意上面我们的论断都需要弱周期引理那个 p+qsp+q\le |s| 的条件,因此只能说明长度 d\ge d 的位置中有且仅有 kxdk-xd 这些 border,如果贸然跳到 kmoddk\bmod d 就可能会错误地漏掉若干 border。

回到本题。我们上面说过,所有 d\ge d 的长度形如 kxdk-xd 的位置均为 border,且这些 border(除了最后一个)后面的字符相同,由于我们需要维护的是前缀最大值,因此这些字符的贡献都被 kk 这一位置覆盖,可以直接忽略他们。注意由于最后一个 border 的字符不同,我们需要先小跳一步计算贡献,然后再跳等差数列。因此就可以在不均摊的 O(logn)O(\log n) 时间内完成跳 fail link 的过程了。只需要把操作离线并建立操作树即可。


I


J

Luogu11585 难度 4

  • f(1)f(1)

建笛卡尔树,那么答案一定是选笛卡尔树上的一个矩形。容易做到 O(n)O(n)

  • f(2)f(2)

如果两个矩形横坐标区间不交,只需要枚举分界点 ii,计算在直线 x=ix=i 前后的最大矩形面积,相加即可。

对于相交的情况,两个一定在笛卡尔树上成祖孙关系,考虑如果选了 u,vu,v 这两个点,其中 uuvv 的祖先,其贡献为 lenv×hu+lenu×hu+lenv×hv-len_v\times h_u+len_u\times h_u+len_v\times h_v

在祖先处统计,李超树合并维护 (len,len×h)(-len,len\times h) 的这些直线即可。

  • f(3)f(3)

对于三个矩形的横坐标区间互不相交的情况,DP 即可。

如果前两个矩形的横坐标区间都和第三个不交,类似 k=2k=2 的两个不交的部分做一遍即可。

设选的三个矩形对应到笛卡尔树上的节点分别为 u,v,wu,v,w

如果 u,v,wu,v,w 依次为祖孙关系就只需要把 k=2k=2 的再做一遍。

具体来说我们设 GvG_v 表示选一个 vvvv 的子孙 ww,其 lenw×hv+lenv×hv+lenw×hw-len_w\times h_v+len_v\times h_v+len_w\times h_w 的最大值,再设 HuH_u 表示选一个 uuuu 的子孙 vv,其 lenv×hu+lenu×hu+Gv-len_v\times h_u+len_u\times h_u+G_v 的最大值,两个都可以用李超树优化。

剩下的唯一情况是选一个祖先 uu,然后选两个 v,wv,w 满足 v,wv,w 互不为祖孙关系,造成的贡献为

我们考虑放宽限制,发现当 uu 不为 v,wv,w 的祖先时,这个东西不会算的更大。考虑对 uu 不做任何限制,只钦定 v,wv,w 不交。那么如果没有不交的限制,我们需要对一个 (leni,leni×hi)(-len_i,len_i\times h_i) 这样的东西求一下凸包,然后和自己做闵可夫斯基和。

考虑如何处理不交的限制。对序列建线段树,每个子树变成一个区间 [l,r][l,r],考虑两个不交区间 [l1,r1],[l2,r2][l_1,r_1],[l_2,r_2],不妨设 r1<l2r_1<l_2,我们在 LCA(r1,l2)\text{LCA}(r_1,l_2) 处统计这个贡献。

具体来说,我们对每个线段树节点维护两个凸包 L,RL,R,然后对每个区间 [l,r][l,r],我们在 ll 的所有祖先的 LL 凸包里面插入这个点,rr 的所有祖先的 RR 凸包里面插入这个点,然后我们对每个线段树节点,把他左儿子的 RR 凸包和右儿子的 LL 凸包做闵可夫斯基和,把得到的这些点放到总的点集里面,最后再对总的点集求一遍凸包。求出这个凸包之后,再枚举 uu 计算即可。

实现的时候写成分治的形式可以减小一部分常数。综上,总复杂度 O(nlogn)O(n\log n)


K

LOJ3341 难度 5

分块。设分出来左散块 A1A_1,中间块 B1,,BkB_1,\cdots,B_k,右散块 A2A_2。那么贡献有 A1A1A_1\leftarrow A_1 即散块对自己,A1A2A_1\leftarrow A_2 即散块对散块,AiBjA_i\leftarrow B_j 即散块对整块,BiBj(ij)B_i\leftarrow B_j(i\neq j) 即整块对整块,BiBiB_i\leftarrow B_i 即整块自己。当然还有同块的情况。

首先带散块的都好做:我们总能拆成 O(n)O(\sqrt{n}) 次查询区间 [l,r][l,r] 内有多少 [x,y][x,y] 中的数这样的询问(下面记这样的查询为查询 c(l,r,x,y)c(l,r,x,y)),离线下来值域分块平衡复杂度即可。

这部分的时间复杂度为 O(qB+nn)O(qB+n\sqrt{n})

如果想要空间线性,发现 A1B,A1A2A_1\leftarrow B,A_1\leftarrow A_2 这样的都可以直接在端点处挂一个区间。

A1A1A_1\leftarrow A_1 怎么算呢,我们可以把他当作同块,用同块的方法计算。这个我们最后说。

对于整块的情况,首先考虑 BiBiB_i\leftarrow B_i,发现由于一块内只有 O(B)O(B) 个数,我们预处理 ans(x,y)\text{ans}(x,y) 表示如果询问的 u,du,d 在块内排名分别是 x,yx,y 的答案即可。这部分复杂度为 O(nB+qnB)O(nB+\frac{qn}{B})。为了找排名还需要处理 rank(i,j)\text{rank}(i,j) 表示 ii 这个数在 jj 块中的排名,这部分也是 O(nB)O(nB)

然后再考虑 BiBjB_i\leftarrow B_j。考虑差分成值域 [1,d][1,u1][1,u1]×[u,d][1,d]-[1,u-1]-[1,u-1]\times [u,d],发现最后一种是好算的:只需要查询 [l,r][l,r] 这些中值在 [x,y][x,y] 中的元素个数 (1l,rnB)(1\le l,r\le \frac{n}{B})

考虑 [1,u1]×[u,d][1,u-1]\times [u,d] 怎么算,写一下式子,设 L,RL,R 为这些整块的左右边界,g(l,r,x,y)g(l,r,x,y) 表示 lrl\cdots r 这些中值在 [x,y][x,y] 中的元素个数,那么这部分就是

那这样就很容易做到线性空间了。

如果想要空间线性,只需要对每块单独做。

那还需要查询一些块的 [1,d][1,d] 的贡献。考虑从小到大加入每个数,并维护 si,js_{i,j} 表示 [i,j1][i,j-1] 中的对第 jj 块的答案贡献,那么如果在 xx 这个块内插入了一个数,只会把 si,xsi,x+cnt(i,x1)s_{i,x}\leftarrow s_{i,x}+\text{cnt}(i,x-1),其中 cnt(l,r)\text{cnt}(l,r) 表示当前 [l,r][l,r] 这些块内已经插入了多少个数。cnt\text{cnt} 可以用前缀和维护。

[l,r][l,r] 块的答案就是 i=lrsl,i\sum_{i=l}^rs_{l,i}。那这部分复杂度是 O(n2B)O(\frac{n^2}{B}),且空间复杂度天然是线性。

对于同块的情况,朴素的想法是直接拆成 O(n)O(\sqrt{n}) 次查询 c(l,r,x,y)c(l,r,x,y),这样就可以过了。

有一个加强版是 Luogu6579,需要线性空间。考虑再分一次块,把这个散块分成长度为 SS 的块,每块内直接暴力 O(S2)O(S^2) 算,块之间就直接加询问,那么这部分的时间复杂度是 O(qBS+qBS)O(\frac{qB}{S}+qBS)。注意由于暴力的那些块长加起来是 BB,因此暴力的复杂度是 O(BS)O(BS) 而非 O(BS2)O(BS^2)

但空间复杂度是 O(qBS)O(\frac{qB}{S}),我们可以偷偷调整 BBSS 的值(不是)并假装他是线性。

于是总的复杂度是 O((n+q)n)O((n+q)\sqrt{n}),空间是(迫真)线性的,实测可以通过 P6579。