3nd ucup 部分题目记录

退役之后一直想着,我至少还是更新一下 ucup 好题和互测好题,但很遗憾一直摆到了现在;论文也还没有开始施工。

我一直觉得自己如果改掉不良的生活习惯,提高自己的学习效率,完全可以达到更高的水平,但很遗憾我确实战胜不了自己,我或许永远都看不到自己的上限了。

马上就 NOIP/CTT 了。我觉得我起码得象征性的训练一下。我仔细想了想,我还有一个上 LGM 的梦;我是 ucup 队里最菜的人,我不想继续次次在后期摆烂。

那趁我清醒,开始写点东西吧。

先写下没打但是想做的:stage4,stage8

2J. Polygon II

\(n\) 个在 \([0,2^{a_i}]\) 随机的实数,求它们能围成多边形的概率。\(n\le 1000\)

算不合法的概率,那就是枚举最大的边 \(p\),要求 \(\sum x\le 2x_p\) 。改变一下 \(x_p\) 的定义,重新令其为 \(2^{a_p}-x_p\) ,这样就得到 \(\sum x\le 2^{a_p}\) 了。

接下来是关键的一步: 由于我们只关心 \(\sum x\) 和一个整数的大小关系,那其实可以把 \(x\) 拆成整数部分和小数部分。也就是如果指定 \(x\) 的整数部分,令 \(A=2^{a_p}-\sum [x]\) ,那合法的概率其实就是 \(n\)\([0,1]\) 间随机的实数加起来 \(\le A\) 的概率,这可以容斥计算。

问题转化成:计算 \(A\geq 0,A\geq 1,A\geq 2,\dots,A\geq n\) 的概率。

现在 \([x_i]\)\([0,2^{a_i})\) 随机的整数,发现我们可以进一步拆解:可以看成二进制下每一位都有 \(\frac{1}{2}\) 的概率为 \(1\) 。最后的计算就是数位 dp 状物了,从低到高 dp ,记录下当前 \(\sum x\) 和限制的大小关系,以及往后的进位。复杂度大概是 \(O(n^4\log V)\)

怎么优化呢,由于我们最后只需要计算 \(\sum e_iP(i+\sum [x]\le 2^{a_p})\) 状物,我们在 dp 的时候只需要在最低位先垫上 \(i+1\) ,最后看第 \(a_p\) 位有没有进位即可,于是也不需要记与限制的大小关系,答案就是 \(dp_{a_p,0}\) ;又可以发现并不需要枚举 \(p\) ,所以复杂度降为 \(O(n^2\log V)\)

2L. Chords

一个环上 \(2n\) 个点连了 \(n\) 条边,要取出尽量的边满足两两不交,数据随机。

\(n\le 10^5\)

先编出来 \(O(n^2)\) 的 dp ,就是设 \(dp_{i,j}\)\([i,j]\) 内能取多少线段。发现由于数据随机,答案是 \(O(\sqrt{n})\) 级别的,于是经典的交换状态和值域,设 \(p_{j,k}\) 是令 \(dp_{i,j}\geq k\) 的最大的 \(i\) ,发现 \(p\) 也是好算的,复杂度 \(O(n\sqrt{n})\)

2I. Mercenaries

\(n\) 个点, \(i\)\(i+1\) 的边上有若干物品,物品有属性 \((x,y)\) ;点 \(i\) 上也有一件物品。现在有若干询问 \(R,a,b,c\) ,你想求出最大的 \(L\) 使得:能从点 \(L\) 到点 \(R\) ,使得取出点 \(L\) 的物品,再在路上每条取一件物品,能使得 \(a(\sum x)+b(\sum y)\geq c\)

\(n,q\le 2*10^5\) ,物品总个数 \(S\le 5*10^5\)

可以发现这个问题一看就很凸包。

建出线段树,设 \(G_p\) 是节点 \(p\) 内每条边取一个物品得到的 \((\sum x,\sum y)\) 形成的上凸包;\(F_p\) 是节点 \(p\) 内取一个点为起点,走到右端点的 \((\sum x,\sum y)\) 构成的凸包。令 \(M\)\(mid\)\(mid+1\) 的物品构成的凸包,发现 \(G_p=G_l*G_r*M\)\(F_p=F_l*G_r*M+F_r\) ,其中 \(*\) 是闵可夫斯基和,\(+\) 是求两个点集并起来形成的凸包。查询在线段树上二分即可。

发现每次询问要对 \(O(\log n)\) 个凸包求出,取一个点 \((x,y)\) 使 \(ax+by\) 最大。考虑把询问离线下来,把 \((a,b)\) 按极角排序,然后只用对每个凸包维护一个指针即可。复杂度 \(O((n+q+S)\log n)\)

3K. Knocker

这场开始和两个超级传奇大师做队友。

给你一个序列,一次操作能整体模一个数,问最后能得到多少不同的序列。\(n\le 500\)

(记录官方题解)先来分析终止状态 \(b\) 合法的条件。不妨对 \(a\) 从大到小排序并去掉相同的位置,接下来观察 \(b_1\) ,现在不妨设 \(k=b_1-a_1\) ,我们有结论:对于 \(a_i\geq k\)\(b_i\) 一定等于 \(a_i-k\)

只需要证明一步操作后这个条件成立,然后归纳即可。不妨设模 \(x\) 后得到的分别是 \(a'_1\)\(a'_i\) ,那首先有 \(a_1-a'_1\le k\le a_i\) ,于是 \(a_i-a'_i\geq a_1-a'_1\) 。另一方面由于 \(a_i-a'_i=x[\frac{a_i}{x}]\) 。所以 \(a_1-a'_{1}\geq a_i-a'_i\) 。就发现 \(a_1-a'_1=a_i-a'_i\) 了。

回到问题,这里还有一个条件:\(a_i<2k\) ,一步有效操作后 \(a_1\) 一定会减半。发现这之后直接取模数为 \(k\) ,即可让 \(a_i\geq k\) 的数都变成 \(b_i\) 了;这也是最优的方法,因为取更小的数后效性更大,取更大的不合法。你发现这样就不会影响 \(a_i<k\) 的那些数,于是此时递归到了一个子问题!只不过我们为了不再影响已经固定了的这些数,会要求之后每次取的模数 \(> b_1\)

于是设 \(dp_{i,j}\) 表示只使用 \(\geq j\) 的模数能得到的不同 \(b_i\)\(b_n\) 个数,转移枚举 \(k\) 即可。复杂度 \(O(n^3)\)

3B. Breaking Bad

给你一个 \(n*n\) 的矩阵,对于 \(k=0,1,\dots,4\) ,问是否存在排列 \(p\) 使得 \((\sum A_{i,p_i})\bmod 5=k\)\(n\le 1000\)

首先可以想到随机赋权算行列式,可惜过不了。

(记录官方题解)

观察到大多数情况下每个 \(k\) 都是有解的。考虑如果有一个排列满足能取出不交的四对数 \((i,j)\) ,都满足 \(a_{i,p_i}+a_{j,p_j}\neq a_{i,p_j}+a_{j,p_i}\) (模 \(5\) 意义下)那就可以通过交换/不交换 \(i,j\) ,对排列进行调整,不难发现一定能调整出所有可能的余数。

(其实有一个数学上的结论是,对于 \(k\) 个模 \(p\)\(0\) 的数 \((k<p)\) ,它们不同的子集和一定有至少 \(k+1\) 个。)

接下来先找到任意一对这样的 \((i,p_i),(j,p_j)\) 。事实上去尝试 \((i,j),(i+1,j+1)\) 就好了,反证易得。如果找不到的话也不难说明此时排列怎么取,结果都是一样的:一定存在序列 \(R,C\) 使得 \(a_{i,j}=R_i+C_j\)

接下来直接把 \(i,i+1\) 行和 \(j,j+1\) 列删掉,继续找下去,如果最终找到了四对我们就 win 了。否则看一下发生了什么,设此时找到了 \(q\) 对,发现我们其实就得到一个 \((n-2q)*(n-2q)\) 的子矩阵,满足 \(a_{i,j}=R_i+C_j\) 。不妨设 \(q=3\) ,把特殊的 \(6\)\(6\) 列提到最前面。接下来直接状压 dp:

\(dp_{i,S,h}\) 表示考虑到第 \(i\) 行,关键列取了 \(S\) 且当前和为 \(h\) 是否可能。注意这里算和的时候,我们先把和当成 \(\sum R+\sum C\) ,每次取了一个特殊的格子后就把对应的 \(R,C\) 减去,再把实际值加上即可。复杂度即为 \(O(4^mn)\) ,本题中 \(m=5\)

感觉这场这两个题都不在我脑洞范围内啊,大概想一想,K 是找到了判定过程中的子问题,从而设计 dp;B 是观察到了难搞的情况形式很好看,于是也不难搞了。

5J. Prefix Divisible by Suffix

问你 \(n\) 以内有多少数满足:把十进制写出来,能够把它划分成两段 \(p,q\) ,使得 \(q+c|p\) ,其中 \(c\) 是给定常数。\(n\le 10^{14},c\le 10^4\)

发现自己其实一眼就会了,只是不敢剪枝。考虑直接枚举最低的 \(7\) 位,发现此时我们对 \(n\) 提出来若干限制 \((p,c)\) 表示:若模 \(p\) 余数为 \(c\) 就一定合法了。对这些限制容斥,这样就得到了一个算量 \(20^{7}*\log V\) 的做法。(需要解 CRT)

但自己想想,算量真的会那么大吗?可以发现指定容斥的集合,其模数的 lcm 很有可能很大,于是容斥的时候直接搜索要钦定的集合,lcm 太大了就剪掉。然后就能通过了。。挺没意思的。

5C. Painting Fences

给你一个网格,给出每个格子开始的颜色(黑/白),一次操作可以选一条与 x/y 轴平行的直线对网格翻折,对于重合的两个格子,如果一个为黑的话可以把另一个也染黑。求出使得所有格子变黑的最小次数。\(n\le 1000\)

倒着来看这个过程,于是发现起作用的其实只是一个全黑的子矩形,设 \(f_{l,r}\) 是假设这个矩阵是 \(1*n\) 的,且 \([l,r]\) 为黑那需要操作多少次,\(g_{l,r}\) 同理为矩阵长为 \(m\) 时的次数。则可以发现一个子矩阵需要的操作数就是 \(f_{xl,xr}+g_{yl,yr}\)

枚举 \(xl,yl\) 。一个一开始就能做出的观察是答案很小,具体的发现:\(f_{l,r}\) 的大小都是 \(O(\log n)\) 级别的,所以求出 \(p_{l,i}\) 表示最小的 \(r\) 使得 \(f_{l,r}\le i\)\(q_{l,i}\) 同理。于是只需要枚举 \(xr=p_{xl,i},yr=q_{xr,j}\) 看看是否合法即可。这里可以双指针,复杂度 \(O(n^2\log n)\)

7E. Express Eviction

给你一个 \(n*m\) 的网格图。有一些格子存在障碍,障碍可以 ban 掉它周围的四个顶点。现在你想知道:至少要移除多少障碍,才能从 \((0,0)\) 走到 \((n,m)\)

先想想如果已经知道哪些点被 ban 了该怎么判断,发现其实就是,如果存在 \(x=0/y=m\) 的点与 \(x=n/y=0\) 可以通过 ban 掉的点八联通起来,那就寄掉了。

进一步可以发现,确定障碍后寄掉的条件其实就是: \(x=1/y=m\) 的某个障碍可以走到 \(x=n/y=1\) 的障碍,其中每一步只能走到 \(x,y\) 之差都不超过 \(2\) 的障碍,证明比较容易。

对着这个做最小割就好了。

7C. Price Combo

很牛的一个题,先咕了。

10H. Intersection of Paths

给定一棵有边权的树,询问:临时修改一条边的边权,然后给定 \(k\) ,求出取 \(k\) 条端点不重合的路径,交的边权和的最大值。\(n,q\le 5*10^5\)

取重心为根,发现如果存在一组方案的交会包含 \(u\)\(v\) 的路径,就等价于 \(sz_u,sz_v\geq k\) ,于是如果没有修改边权的事情,我们就只用求出 \(sz\geq k\) 的点中距离最远的两个点。

现在有边权修改,怎么处理,我们其实只需要求出删掉这条修改的边后,两个子树分别的直径即可。注意到这个直径的端点要么是叶子,要么是删掉的边的端点,那我们考虑把 \(k\) 相同的询问放到一起处理,将保留 \(sz\geq k\) 的点后得到的树的叶子拎出来,容易发现它们只会有 \(\frac{n}{k}\) 个,每次询问相当于查一段区间的点的直径,线段树处理就可以平衡。复杂度 \(O((n+q)\log n)\)

冷静一下,其实这样处理烦了,我们把询问按 \(k\) 从大到小排序,这样只需要维护线段树,要求每次激活一个点,以及查询一个区间激活的点的直径即可。复杂度仍是 \(O((n+q)\log n)\)

LOJ177 生成子群阶数

给你 \(m\) 个长度为 \(n\) 的排列,问你它们能复合出多少不同的置换,其中每个排列都能用若干次。\(n,m\le 50\)

发现还不会这个东西,学一下。

首先可以把给定排列的逆也加进来,因为设其环长 lcm 为 \(L\) ,其实逆就可以表示成原来的排列复合 \(L-1\) 次。

考虑建出一张图,对于一个给定的排列,对任意 \(1\le i\le n\) ,我们从 \(i\) 连向 \(p_i\) ,这样一组操作可以看做是从 \(1\) 开始的一条路径,途中会复合上所有经过的置换。可以发现这里走到的点就代表当前 \(p_1\) 的值。

现在先求出以 \(1\) 为根的生成树,设终点为 \(t\) ,那对于 \(1\)\(t\) 的任意一条路径,考虑在走到 \(t\) 之后,沿着树边走回 \(1\) ,再走到 \(t\) ,可以发现这样效果是不变的,于是终点为 \(t\) 的路径一定都形如:从 \(1\) 出发走回了 \(1\) ,再按照树边走向 \(t\)

就可以得到一个结论,方案等于:\(p_1\) 可能的取值数 ,乘上 \(p_1=1\) 的方案数。

继续思考对于一条走回 \(1\) 的路径 \(1\rightarrow u_1\rightarrow u_2\dots \rightarrow u_k\rightarrow 1\) ,它和 \(1\rightarrow u_1\rightsquigarrow1\rightsquigarrow u_1\rightarrow u_2\rightsquigarrow 1 \rightsquigarrow u_2\rightarrow u_3 \rightsquigarrow 1\dots \rightarrow u_k\rightarrow 1\) 是等价的。其中 \(\rightsquigarrow\) 是在走树边。

于是得到结论:\(p_1=1\) 的排列都可以通过将 \(1\rightsquigarrow u\rightarrow v \rightsquigarrow 1\) 得到的排列复合得到。

这样做的好处是,我们可以用的置换都满足 \(p_1=1\) ,于是可以递归到 \(n-1\) 的子问题继续做。但问题是我们建出的图有 \(nm\) 条边,也就是说子问题里 \(m:=nm,n:=n-1\) ,这显然就炸掉了。结论是,我们只需要把这 \(nm\) 个置换先改造成 \(O(n)\) 个,改造的方法是,我们进行随机,在这些置换中随机选择一个子集,将内部的置换复合起来,这样随 \(O(n)\) 次,把每次随机得到的置换给递归下去。

复杂度 \(O(n^5)\) ,瓶颈在于要做 \(O(n^2)\) 次随机复合的过程 ,每次期望会复合 \(O(n^2)\) 个排列,单次复合是 \(O(n)\) 的。

11J Again Permutation Problem

只需要把 LOJ177 的答案和 LOJ4127 的答案乘起来就好了。

回顾一下 LOJ4127 的做法,其实发现这里分析的方法是类似的,我们仍然先把排列的逆加进来,然后建立一张 \(n^2\) 个点的图,对于一个给定排列我们在点 \((i,j)\) 和点 \((p_i,p_j)\) 间连边。这样有结论是:若 \((i,j),(a,b)\) 联通则 \(p_i=a,p_j=b\) 的方案数等于 \(p_i=i,p_j=j\) 的方案数。证明是和上面那个题的证明基本一致的。

于是算逆序对的期望只需要枚举 \(i<j\) ,记与 \((i,j)\) 联通的满足 \(a<b\) 的点数为 \(x\)\(a>b\) 的点数为 \(y\) ,那贡献其实就是 \(\frac{y}{x+y}\) 了。更直接的,就是对每个联通块计算 \(\frac{xy}{x+y}\) 的和。

11F Train Seats

题意是有一些椅子,每次可以拿走一个椅子,代价是离它最近的两把椅子的坐标差(若左边没有则为 \(0\) ,右边没有则为 \(m+1\)) 。让代价的和最大。\(n\le 2*10^5\)

\(a\) 排序,设 \(b_i=a_{i+1}-a_i\) (令 \(a_{n+1}=m+1\)),则一次操作相当于合并 \(b_i,b_{i+1}\) ,代价为 \(b_i+b_{i+1}\) ,最后让代价最大。建一棵二叉树来刻画这个过程,然后我们有结论:不可能有一个点的两个儿子都是非叶子。证明就考虑四个数 \(x,y,z,w\) ,我们相当于要证明:先合并 \((x,y),(z,w)\) ,再合并 \((x+y,z+w)\) 一定不优。原因考虑此时代价是 \(2(x+y+z+w)\) ,而从左往右依次合并的代价是 \(3x+3y+2z+w\) , 从右往左是 \(x+2y+3z+3w\) 。把都有的东西减掉,发现 \(\max(2x+y,z+2w)\geq \frac{2x+2w+y+z}{2}\geq x+w\)

那其实就可以看到我们只有两种可能:要么合并好 \([2,n]\) 再把 \(1\) 合并进来,或者合并好 \([1,n-1]\) 再把 \(n\) 合并进来。也就是说,每次会删掉 \(b\) 的开头/结尾,代价是当前剩余的长度乘上选择的数。

直接使用 qoj2070 的代码即可。大概思路就是枚举最后保留的位置 \(k\) ,那就是对一棵只有两条链的树做 exchange argument,利用线段树来合并两侧已经出现的连续段即可。

11O New School Term

差点把我们队逮捕了的题。

题意是有一个 \(2n\) 个点的无向图,你需要选择一个边集,使得能黑白染色且 白点个数=黑点个数 的前提下,使选择的边的 \(\sum 2^{编号}\) 最大。

\(n\le 5000,m\le 10^6\)

从大到小尝试加入每条边,先看一下加入后怎么判断合法。

用拓展并查集判能不能黑白染色:如果 \(u\)\(v\) 在一个联通块就寄了;如果 \(u\)\(v+2n\) 已经在一个联通块,那不会影响,直接加进来即可。

否则我们连上这条边来尝试,发现其实对每个联通块求出黑-白之后做一个背包就好了。

这里我们任意设立一个模数变成算方案,这样的好处是可以支持删除物品。

接下来更新并查集,如果可以连的话,自然就合并 \((u,v+2n),(v,u+2n)\) ;否则你发现 \(u,v\) 一定同色,于是合并 \((u,v),(u+2n,v+2n)\)

这样每次做尝试都会让联通块个数减少,于是复杂度 \(O(n^2+m)\)

11N Product Matrix

题意是定义 \(P(x)\) 是一个 \(n*n\) 的矩阵满足:\(P(x)_{i,j}=a_{i,j}x+b_{i,j}\)

现在需要求出 \((\prod\limits_{i=0}^{m-1} P(2^ix))_{1,1}\) 这个多项式每一项的系数。\(n\le 6,m\le 5*10^5\)

尝试直接插值。

求出 \(x=2^0,2^1,\dots,2^{m}\) 时这个式子的值,设 \(x=2^i\) 时答案为 \(c_i\) ,那我们的多项式就长成 \(\sum c_i\prod\limits_{i\neq j}\frac{x-2^j}{2^i-2^j}\)

现在分为两步,第一步是怎么算 \(c\) ,第二步是怎么算最后这个多项式。先来看第一步,令 \(A_i=P(2^ix)\) ,则 \(c_i\) 就是把 \(A_i\)\(A_{i+m-1}\) 乘起来之后 \((1,1)\) 处的值,于是只需要求出 \(B_i=\prod\limits_{j=i}^m A_j,C_i=\prod \limits_{j=m+1}^{i} A_j\) ,则 \(c_i=(B_iC_{i+m-1})_{1,1}\) ,复杂度 \(O(n^3m)\)

再来看第二步,我们固然能直接 \(O(m\log^2m)\) 求出来,但这个太慢了过不了。

先把式子写成 \(\sum c'_i\prod\limits_{i\neq j}(x-2^j)=\prod (x-2^i)\sum \frac{c'_i}{x-2^i}\)

\(\prod (x-2^i)\) 可以分治:考虑得到 \(\prod\limits_{i=0}^{m-1} (x-2^i)\) 后怎么求出 \(\prod\limits_{i=m}^{2m-1}(x-2^i)\) ,记前者第 \(i\) 项系数是 \(a_i\) ,则后者第 \(i\) 项的系数就是 \(a_i2^{(m-i)m}\) 。复杂度 \(O(m\log m)\)

\(\sum \frac{c'_i}{x-2^i}=\sum\limits_{i} \frac{c'_i}{-2^i}\sum\limits_{j}\frac{x^j}{2^{ij}}\) ,于是第 \(j\) 项系数就是 \(\sum\limits_{i} \frac{c_i}{-2^{i+ij}}\) 。利用 chirp-z 处理 \(2^{ij}\) 即可,复杂度 \(O(m\log m)\)

这题最难的一步是第一步,想到直接插而不是干别的事情。

13G Count Pseudo-Palindromes

题意是给你一个序列满足每种数出现恰好两次,然后对序列的每个位置,询问有多少个包含它的区间是合法的。合法的定义是:出现一次的数有恰好一个。\(n\le 5*10^5\)

抛开异或哈希的思路,我们直接考虑设 \(A_{l,r}\) 表示 \([l,r]\) 内出现一次的颜色,发现颜色对 \(A\) 的贡献就是把两个矩阵加 \(1\) ,而查询就是查 \(A\) 的某个子矩阵里有多少 \(1\)\(A\) 矩阵最小的值是 \(0\) ,如果是 \(1\) 就好做了,考虑合法的区间一定满足 \(l,r\) 奇偶相同,且这样的 \(A_{l,r}>0\) ,于是枚举 \(0\le k<2\) ,维护矩阵 \(A'\) 满足 \(A'_{l,r}=A_{2l+k,2r+k}\) 即可。扫描线做完,复杂度 \(O(n\log n)\)

13A 012 Grid

题意是问你有多少填充 \(n*m\) 的矩阵的方案,使得每个数是 0/1/2,且 \(A_{x,y}-A_{x',y'}\in [0,1]\) ,其中 \(x-x'\in [0,1],y-y'\in [0,1]\)

\(n,m\le 2*10^5\)

把 0,1 的分界线,1,2 的分界线画出来,思考怎么样的分界线能使方案合法。先把全 0/全 2 的情况判掉,接下来可以看见两条线一定形如:从右下角开始重合走一段然后分开,再次重合后就不会分开,一起走到左上角。并且为了保证 02 不连通,这重合的一段只能是一条线段,否则就寄了。枚举重合的部分后中间的方案容易用 LGV 算,最后对着这个式子优化,发现可以写成卷积的形式,复杂度 \(O(n\log n)\)

14D A Simple String Problem

题意是给你一个 \(2*n\) 的字符矩阵,取一条起点终点任意,只能往右往下的路径使得:把经过的字符串起来是 AA 串。求出最长的长度。\(n\le 5*10^5\)

考虑把第二个串往后平移一位。接下来使用 优秀的拆分 trick ,画画图发现求几个 lcp 就做完了。

14I A Brand New Geometric Problem

给你一堆正整数,一次操作可以删掉一个数/加入一个正整数,需要通过最少的操作使得:它们的和与积等于给定的两个数。\(n\le 10^5\) 值域 \(10^{10}\)

一个暴力的思路是搜索积的拆分,考虑怎么优化。

设立块长 \(B\) ,我们搜索拆出的 \(>B\) 的数,\(\le B\) 的数直接 dp 。这样就做完了。

14H Subsequence Counting

转化后题意是求 \(\prod\limits_{i=0}^{L-1} A_{ik\bmod L}\) ,其中 \(gcd(k,L)=1\)\(A\) 以若干连续段的形式给出,连续段个数 \(\le 2000\) ,每个 \(A_i\) 是大小 \(\le 10\) 的矩阵,\(L\le 10^9\)

观察 \((ik)\bmod n\) 变化的过程,考虑求出 \(B_i=\prod\limits_{i\geq 0,i+tk<L} A_{i+tk}\) ,可以发现 \(B\) 的连续段个数与 \(A\) 基本相同,我们可以通过线段树处理出 \(B\) 的连续段。发现 \(\prod \limits_{i=0}^{L-1} A_{ik\bmod L}=\prod \limits_{i=0}^{k-1}B_{i(k-L\bmod k)\bmod k}\) 。于是我们递归到了一个子问题:从 \((k,L,A)\) 递归到 \((k-L\bmod k,k,B)\)

可以发现如果每次 \(k\le \frac{L}{2}\) ,我们就能保证递归层数是 \(\log L\) 的。但看起来这里并不是,怎么办呢。考虑 \(k>\frac{L}{2}\) 时,我们可以直接把 \(A\) reverse (\(A_0\) 不动),这样 \(k:=L-k\) ,就满足 \(k\le \frac{L}{2}\) 了。

于是 \(k>\frac{L}{2}\) 时递归到 \((L-k,L,rev(A))\) 即可。复杂度 \(O(nm^3\log n\log L)\)

posted @ 2024-11-27 20:01  grass8woc  阅读(72)  评论(0编辑  收藏  举报