noip2025

炼石计划20

T2 采矿

价值为 \(2^x\) 的情形是 ARC201B。做法见题解。

扩展到这个题只需按照题目中的倍数关系建立新的进制。

T3 找零

考虑 \(k=0\),这是经典的 \(O(n\sqrt n)\) 求拆分数问题。对于空序列,每次将序列 \(+1\) 或者在后面加上一个 \(1\),该过程和拆分数形成双射;当值域 \(\geq B\) 时,直接做这个是 \(O(\frac{n^2}B)\) 的。对于 \(<B\) 的数暴力 dp 即可。

\(k\neq0\) 时,对于大数的影响看上去很难消除,注意到 \(k\) 不大,于是容斥,直接做到 \(O(n\sqrt n+n2^k)\)。要是改成 dp 的话复杂度就是 \(\rm{poly(n,k)}\)

T4 山

难点在于暴力。贪心,显然在最小值不合法的情况下,操作其一定不劣。考虑有多个最小值,此时需要安排一个比较厉害的操作顺序使得代价最小,注意到一定为先操作前后两个,然后再操作中间,代价可以直接计算。线段树维护做到 \(O(n^2\log n)\)

优化很简单,扫描值域,线段树维护即可。采用数据结构上二分,时间复杂度 \(O(n\log n)\)

代码源 noip 模拟赛 1

T4 Genshin Impact

考虑莫队。需要支持单点加,查询前缀和最后一个 \(\geq0\) 的位置。龙逐千灯幻 在类似问题下的技巧是,维护序列后缀最大值形成的单调栈,每次修改会弹出栈中若干个位置,链表+并查集维护;每次判断是否弹出需要维护栈内的差分值;查询就是栈底元素的值。

这个题中有 \(O(n\sqrt n)\) 次修改,\(O(q)\) 次查询,考虑平衡。对值域分块,每块维护上面的结构,则可以做到修改 \(O(1)\)、查询 \(O(\sqrt n)\)。需要用回滚莫队将修改变成非负。考虑左端点移动过程中如何支持撤销,不能直接复制块内链表的结构。当修改全都是对整块操作时可以直接 \(O(1)\) 打标记,于是将莫队块内所有点作为值域分块上的端点,这样会受到修改影响的左端点对应的全部都是整块,可以直接打标记。时间复杂度 \(O(n\sqrt n)\)

OOI2025

神秘作业的题

The arithmetic exercise

显然倒着做,将序列翻转,变成如下问题:\((i-1,j)\) 走到 \((i,j+1)\) 的贡献是 \(a_j\),走到 \((i,j-1)\) 的贡献是 \(-a_j\),在纵坐标始终处于 \([0,n]\) 的前提下最大化总贡献。

第一种做法非常硬核。写出 dp:\(f_{i,j}=\max(f_{i-1,j-1}+a_i,f_{i-1,j+1}-a_i)\)。形式不太好,有两个位置能贡献到 \(j\),每轮 dp 将数组向上平移一位,同时答案提前加上 \(-\sum a_i\),则为 \(f_{i,j}=\max(f_{i-1,j},f_{i-1,j-2}+2a_i)\)。发现奇偶完全独立,同时只会有偶数位置上有值,于是变成经典的 slope trick 形式 \(f_{i,j}=\max(f_{i-1,j},f_{i-1,j-1}+2a_i)\)multiset 维护斜率。

第二种做法比较经典。数据结构维护对括号串的贪心。

Alice, Bob, and two arrays

\(f_{i,j}\) 代表起始位置分别为 \(a\) 中第 \(i\) 段,\(b\) 中第 \(j\) 段,先手的状态。若存在一个能转移到的 \((p,l)\),满足 \(f_{p,l}=0\),那么先手可以直接转移过去,此时 \(f_{i,j}=1\);否则先手必然选择当前所在的颜色 \(x\),暴力维护不断选择 \(x\) 向后跳跃的过程可以做到 \(O(nm(n+m))\)

跳跃终止时意味着存在一个可以转移过去的必败态。将某种颜色单独画到二维平面上,则跳跃是一条斜线。\((x,y)=1\) 当且仅当其可以转移到一个必败态。计算完一个状态后会对平面做矩形覆盖 \(1\)。看似每次都要对 \(O(k)\) 个平面做,实际上只有当前颜色 \(c\) 的平面需要,其它颜色可以简单记录。

于是需要做的就是,矩形更新,查询斜线第一次碰到矩形的位置。倒着做,于是可以贡献到的斜线可以变成一段区间,区间覆盖即可。时间复杂度 \(O((nm+q)\log N)\)

代码源 noip 模拟赛 2.5

T4 DFS 序

容易得到一个 \(O(n^2k2^k)\) 的做法。实际上,支配对总数只有 \(O(n\log n)\) 个。于是可以做到 \(O(n\log n(k2^k+\log n))\)

炼石计划21

T2 小粉兔不想挂科

考虑 \(a_i=1,b_i=i\),此时利用调和级数维护二阶差分状物。考虑 \(a_i=b_i=i\),此时需要求 \(\sum\limits_{j=l}^r(i\% j)\),但是 \(\lfloor\frac il\rfloor=\lfloor ir\rfloor\),令 \(x=\lfloor\frac il\rfloor\),有 \(i\% j=i-x\times j\),于是对于 \(l\leq j<r\)\(i\%(j+1)-x=i\% j\)。整除分块,则只有 \(O(n\sqrt n)\) 这样的查询。整除分块时设置阈值 \(B\)\(i\% j\leq B\) 时预处理上面的东西,否则暴力,复杂度为 \(O(nB+\frac{n^2}{B})\)

T3 管理组招新

简单题。容易直接得到一个 \(O(nk^2)\) 的做法,注意到 \(2k>n\) 时无解,于是 \(k\sim O(\sqrt nk)\),时间复杂度为 \(O(nk\sqrt{nk})\)

T4 兔典序

考虑找到一个合适的位置算贡献,使得答案不重不漏。容易想到在最后一个相等的位置计算,那么需要计算:

  1. \(f_{i,j}\):考虑前缀 \(a[1:i],b[1:j]\),选出两个非空子序列使得完全相同,同时选中 \(i\)\(j\) 两个位置,的本质不同子序列对数。
  2. \(h_{i,j}\):考虑后缀 \(a[i:n],b[j:m]\),选出两个非空子序列使得长度相同,第一个子序列的首个位置大于第二个子序列的首个位置,的本质不同子序列对数。
  3. \(u_{i,j}\):考虑后缀 \(a[i:n],b[j:m]\),选出两个非空子序列使得长度不同,第一个子序列更长,的本质不同子序列对数。
  4. \(fa_i\):考虑后缀 \(a[i:n]\),本质不同子序列数量。

一个基本的问题是,知道了某个东西在强制选中 \(a_i,b_j\) 的所有信息,如何将信息推广至不强制选中。不妨假设要求维护的是后缀,按照 \(i:n\to1,j:m\to1\) 的顺序扫描,\((p,l)\)\((i,j)\) 产生贡献,当且仅当 \(a_{i+1\sim p-1}\) 中没有 \(a_p\)\(b_{j+1\sim l-1}\) 中没有 \(b_l\)。在扫描 \(i\) 的过程中,维护 \(cs_j\) 代表对于此时的 \(i\),当 \(j\) 产生贡献,会产生多少贡献。时间复杂度 \(O(n^2)\)

有了这个方法,后三个实际上都比较好算,改一下本质不同子序列的 dp 方法即可。考虑第一个,转移要求形如二维平面上一个矩形和,于是动态维护二维前缀和即可。最后计算答案只需枚举 \((i,j)\) 代表最后一个相同的位置。时间复杂度 \(O(n^2)\),没想清楚的话会不太好写。

图论专题

CF1305G Kuroni and Antihype

对于求 \(val(i\to j)=a_i\) 的最小树形图,可以变成边权为 \(a_i+a_j\),最后的权值减去 \(-a_{rt}+\sum a_i\)。这题直接用此转化,后面 Boruvka+FMT 即可。时间复杂度 \(O((n+V)\log n\log V)\)

CF1893E Cacti Symphony

对于点研究。首先,边权为 \(x\) 的边都可以直接忽略,因为这些边不会改变异或值是否 \(\in\{0,x\}\)。同时,设另外两种权值为 \(y,z\),则任意两条边都可以匹配,因为 \(y\oplus z=x\),同权值的边异或会得到 \(0\)。于是只关心边权不为 \(x\) 的边数奇偶性。

边的限制实际上就是,需要选一个端点,为其贡献 \(1\),要求所有点的价值都为奇数。先固定所有点权。当原图是树时,可以由上往下直接确定;对于仙人掌,注意到每次要么加入一条边(直接确定方案数),要么加入一个环(对环统计方案数,然后乘上 \(\frac23\))。

CF1630F Making It Bipartite

如果有 \(a<b<c\)\(a\mid b\mid c\) 这种结构就不合法,意味着每个数在整除它的数和被整除它的数中只能有一种。考虑建成有向图,此时就是要保留一些点,使得所有点只有入度和出度中的至多一种。拆点,将 \(i\) 拆成有入度和有出度两个点,于是要求一张无向图的最大独立集(只能删点,不能删边)由于原图是偏序集,所以无向图也是偏序集,。考虑通过合适的方式将其定向为有向图,根据 Dilworth 定理,偏序集最大独立集=最长反链=最小链覆盖。于是需要求最小链覆盖。

最小链覆盖本质上是,加入一条链时,设当前所在的点为 \(x\),则可以加入 \(x\) 可达的点 \(y\) 到当前这条链上。于是传递闭包维护可达性,建图求最大匹配即可。匹配的过程就是在将两条已知的链合并。根据一些分析,复杂度是对的。

怎么还剩下了一万个困难题。。。

CF1338E JYPnation

题目的限制是一个点的所有入点不会成环。可以证明,两个点之间的最短路只有 \(1,2,3\),否则可以发现会违反限制。最短路为 \(1\) 的方案数为边数。接下来只需要统计最短路为 \(2\) 的方案数。考察结构可以发现对于一条最短路 \(u\to i\to v\)\(u\) 的出点不可能成环,同时只需要关心 \(u\) 出点中拓扑序最大的点,可以平方统计。

还有不可达的情况,对每个 SCC 分别考虑即可。

IOI2019 景点划分

题解写得很好。

十连测 day9

T2 binstr

题解是对折线考虑,不过可以直接硬做。容易发现最终子串一定是保留序列的一个子序列,考察一段能否被删空,当 \(0\) 的数量不多于 \(1\) 的数量时一定可以被删空,否则不可以。于是直接有平方的 dp,转移稍微推一下就可以数据结构 \(1\log\) 维护。

T3 disconnect

首先对于连通块代价的刻画是,连通块权值和乘上周围相连的连通块数,看似是需要对这个东西 dp。实际上需要分析性质,缩点后的图必然是菊花,不然合并两个连通块一定不劣,同时删去的边必然和叶子相连。注意到这个的途径是,往下推所有删除的边,\(t_u\) 基本不会发生改变。

可以写出删去一个叶子前缀的答案,是凸的,二分即可。数据结构维护。

T4 partition

容易设计出一个平方的 dp 来计算总的方案数,\(f_{i,j}\) 代表放完 \(1\sim i\),最靠前的被覆盖的位置是 \(j\) 的方案数。转移可以直接做到 \(O(1)\)。考虑这个 dp 本质上是求一个 DAG 从第零层走到第 \(n\) 层的方案数,一个点的 dp 值就是从第零层走到那个点的方案数。考虑如何暴力计算钦定一个点在 \(S\) 中,只保留 \(i-1\to i\) 中选中 \(i\) 的转移,重新做 dp 即可。可以枚举这些边,只需要计算从第零层走到某个点的方案数和从某个点走到第 \(n\) 层的方案数即可。时间复杂度 \(O(n^2)\)

线段树维护此过程,时间复杂度 \(O(n\log n)\)

炼石计划22

T3 treasure

容易注意到当经过的关键点序列不同时,方案一定不同,基于此直接 dp,获得 \(74\) 分。这个 dp 会错掉的原因是,我们认为不关心是否走到状压过程中记录的 \(x\in S\),这样不会使最少步数的计算出错,但会使方案数的计算出错。考虑 \(3\to2\to1\to4\)\(3\to1\to2\to4\)

于是 dp 需要非常严谨地刻画每一步转移。处理 \(h_{x,y}\) 代表 \(x\to y\) 不经过其它关键点的方案数,枚举最后一个经过的关键点进行转移。dp 时分两种考虑,转移到 \(S\) 外部的直接利用 \(h\) 来转移;转移到 \(S\) 内部的看上去不太好做,可以做一个 Floyd 来转移。时间复杂度 \(O(m^32^m)\)

集训队互测2025 Round3

T1 火花

\(t=0\) 的部分分是非常经典的树上依赖背包,做法是在 dfs 序上 dp,每次不选一个点就直接跳到子树外。\(t\neq0\) 时问题出在我们必须钦定子树内选的链数量。考虑差分,在欧拉序上考虑,令 \(i\) 的第一次出现是 \(l_i\),最后一次出现是 \(r_i\),则会在进入 \(i\) 子树和离开 \(i\) 子树时分别决策一次,实际上就是把物品分成两次决策,每次决策尽量多的物品。钦定所有还未考虑的点中取了 \(t'\) 条链,对于一种方案,其进入子树 \(i\)\(t'=t_0\),离开子树 \(i\)\(t'=t_1\),则在进入子树时决策 \(c_i-t_0\) 个物品,此时会有 \(t_0-t_1\) 个物品在子树内被决策,离开子树时只需决策剩下 \(t_1\) 个物品。注意还需决策是否选择一条结尾是 \(i\) 的链。

上面的转移是要求 \(i\) 被选中(因此进入子树时至少需要选择一个物品)。当 \(i\) 不选中的情况仍然是直接跳到子树外,此时枚举子树内选了几条链,需要维护前 \(j\) 大的链之和,可以在 \(O(nt)\) 的时间复杂度内完成。利用单调队列优化背包,时间复杂度 \(O(nkt^2)\)(状态数 \(O(nkt)\),当 \(i\) 不选时需要 \(O(t)\) 转移)。剩下的部分题解给了两种做法,一种是利用 \(O(nk^2t)\) 的做法来平衡,非常需要复杂度分析的手法;实际上 \(i\) 不选时那个 \(O(t)\) 的转移看上去就很有四边形不等式之类的性质(本身转移函数就是凸的),因此分治做到 \(O(nkt\log t)\)

T3 少年汹涌

考虑 \(n=1\)。注意到 \(\log V\) 位开始的高位,数值变化都是连续的。数位 dp,暴力做法是记 \(f_{i,j,k}\) 代表低 \(i\) 位值为 \(k\)\(i\) 位往后 popc 为 \(j\) 时第一次进位到 \(i+1\) 的值,\(g\) 代表步数。从 \(i-1\) 位的状态转移过来即可。由于数值变化是连续的,因此第一次进位到 \(i+1\)\(\log V\sim i\) 位必然全是 \(0\),于是更改状态为低 \(\log V\) 位值为 \(k\)\(i\) 位往后 popc 为 \(j\)\(\log V\sim i\) 全零时第一次进位到 \(i+1\) 的值。转移考虑先通过 \(f_{i-1,j,k}\) 得出把第 \(i\) 位进位成 \(1\) 的值以及步数,此时仍然有 \(\log V\sim i-1\) 位全零,于是可以继续通过 \(f_{i-1,j+1,?}\) 转移过来,状态数 \(O(\log V^3)\),转移 \(O(1)\)

查询时考虑将 \(x\)\(\log V\) 位往后的 \(1\) 提取出来,通过进位将这些位置变成 \(0\),维护步数。当 \(>L\) 时,开始从高往低考虑,维护步数。单次查询时间复杂度 \(O(\log V)\)。多组查询的一个基本想法是容斥,\(x\to x+w_{popc(x)}\) 连边后即要求出两点的 LCA。可以直接倍增,需要求 \(x\)\(2^y\) 步会得到的值,同样类似上面贪心。可以在 \(O(\log^2 V)\) 的时间内求出 LCA。

注意到答案是虚树大小,考虑求虚树。那么需要比较 dfn 大小,这实际上就是要求出跳到 LCA 前的最后一个点,比较这两个点即可,时间复杂度 \(O(n\log n\log^2 V+\log^3 V)\)。瓶颈只在求 LCA 上(其余步骤都是 \(O(\log V)\) 的),将两个数同时从低往高处理,直到某一位会让两数相等后再从高往低做,这个相等时刻一定会在我们上面做法的某一次进位后出现,仍然考虑 \(\log V\) 位开始数值变化连续大概能说明道理。时间复杂度 \(O(n\log n\log V+\log^3 V)\)

杂题选讲 11.10

CF2164F Chain Prefix Rank

注意到可以确定一条祖先后代链的相对顺序,基于此直接维护连续段可以通过 F1。

这个做法并不好优化。我们可以求出来每对祖先后代的大小关系,建图以后等价于对这个 DAG 做拓扑序计数。一般的 DAG 肯定是做不了,考察性质。首先缩减边数,\(i\) 只需和两个祖先有连边,即 \(1\to i\) 这条链上最后一个小于 \(i\) 和第一个大于 \(i\) 的。不妨在 \(1\) 上面加一些节点 \(s,t\),其中 \(a_s\) 极小,\(a_t\) 极大,使得每个 \(i\) 都和恰好两个祖先连边。则可以发现,若不断缩掉二度点(即这个建图的逆过程),可以简化为只有一条 \(s\to t\) 的有向边。

容易在缩点过程中维护拓扑序数量。考虑如何建图,平衡树直接维护即可。时间复杂度 \(O(n\log n)\)

CF2164G Pointless Machine

通过多个单点信息复原树的一般方法是剥叶子。于是有两个部分,需要查询每个点的度数,以及父亲。一次询问可以获得一个点与其前面点的连边数量,询问两次即可获得所有点的度数。考虑查询父亲,二进制分组,求出 \(f_{i,j}\) 代表 \(i\) 的邻居中有多少点第 \(j\) 位和 \(i\) 不同。这样查询次数是 \(2\lceil\log_2n\rceil+1=33\),换成三进制即可做到 \(3\lceil\log_3n\rceil+1=31\)

QOJ14711 Following Arrows

不妨考虑网格为 \(1\times m\)。显然构造到步数最大的情况是 LLLLLLLL...LLLLLLL,不过这个最大步数仍然是 \(O(m^2)\) 的。考虑走的形态,每次走到一个新位置就会掉头,这个掉头一定会直接走到 \(1\),因为当走到 \(i\) 时,\(1\sim i-1\) 的方向一定都和终点的方向相反。考虑 RRRRRR...RRRRRR,当走到 \(i\) 时,\(1\sim i-1\) 必然是全 L,此时若第 \(i\) 位保持 R,那么直接往后走,否则步数会加上 \(2i\)。这个做法带来的重要提示是,每一位都是独立的。

考虑二维的 \(n\times m\) 网格。先构造一条 \((1,1)\to(n,m)\) 的尽量长路径,我们钦定就沿着这个路线走,当走到某个位置 \((i,j)\) 时,前面的位置必然被翻转成了和终点不同的方向,注意拐角处可能变成了一些奇怪的方向,但不重要。若 \((i,j)\) 的位置没有指向终点,那么会往先前的点走,不过最后仍然会走回到 \((i,j)\),可以发现此时每个位置仍然独立,于是应用背包来计算步数。为了避免一些奇怪情况出现,初始钦定的路线需要填满整个网格,这样可以保证任意向前走后仍然在路线上。有可能一个路线无法覆盖值域中的每个步数,构造多个初始网格即可。

QOJ9870 Itmes

实际上就是要求一个 \(n\) 次多项式的 \(n\) 次方 \(m\) 次项系数 \([x^m]f^n(x)\) 的值。本题的做法是 tricky 的。先将 \(m\) 减去 \(\lfloor\frac mn\rfloor\times n\),同时每个数都减去 \(\lfloor\frac mn\rfloor\)。那么值域被限制在了 \([-n,n]\)\(0\leq m<n\)。对于一个选数的方案,若其和等于 \(m\),那么必然存在排列这些数的方案使得每个前缀和都 \(\in[-n,n]\),构造应该是经典的。

于是 \(f^n(x)\) 只需保留 \(O(n)\) 项系数,倍增即可。时间复杂度 \(O(n\log^2 n)\)。这个 trick 的更强应用是 Equal Sum。

QOJ9691 Little, Cyan, Fish!

考虑全是直线怎么做,可以变成 3sum 问题,维护三个多项式 \(f,g,h\),当第 \(i\) 行有数时 \([x^{-i}]f=1\),当第 \(j\) 列有数时 \([x^j]g=1\),当 \(i-j\) 这条斜线有数时 \([x^{-i+j}]h=1\),于是需要求 \([x^0](f*g*h)\),一遍 FFT 即可。

不全是直线时,对平面分块,块长 \(B\times B\)。块内会有若干条直线,还会有一些散点,对直线做 FFT,散点暴力判断,时间复杂度 \(O(n\sqrt{n\log n})\)。考虑对行扫描线,此时 \(f\) 有单点修改,\(\operatorname{DFT}(f)\) 的变化可以在 \(O(B)\) 的时间内维护出来,\(gh\) 同理。由于查询只需要 \(0\) 次项系数,可以 \(O(B)\) 求出。时间复杂度 \(O(n\sqrt n)\)

FMT 也有类似套路,可以做到 \(O(B)\) 单点修改,\(O(\frac VB)\) 求出 FMT 后的单点值。

代码源 noip 模拟赛 4

T1 二分图

先考虑没有只能跳同侧边的限制,那么需要加尽量少的边使得存在欧拉路径,可以用一条链将所有奇度点连通块连起来。有同侧边的限制之后只需要多判断一些情况。

T2 斜堆

注意到左子树大多数情况下都比较有规律,一定预处理后直接做即可。

T3 构造 LIS

\(3\log_2 n\) 的构造是考虑二进制。减少构造次数只需换成别的进制。

Interesting Counting Problem

按照 dfs 序 dp,时间复杂度 \(O(m\sum size)\),注意到和子树大小相关。此时 dp 数组上的每个位置存的值是 \(W_u\neq0\) 时子树和为 \(i\) 的方案数,优先对重儿子 dp,此时复杂度为 \(O(nm\log n)\)

南开中学 11.12 模拟赛

t3 P11567 t4 AGC061E

重庆市 11.13 noip 联考

T1 digit

考虑 \((D,10)=1\) 的情形,令 \(p_i\) 代表 \(i\) 后缀对应的二进制数,那么区间合法等价于 \(p_l\equiv p_{r+1}\pmod D\)。对于不互质的情况,记 \(D=2^x5^ym\),那么限制等价于模 \(2^x,5^y,m\) 都需要为 \(0\)。当位数足够高时 \(s_j\)\(2^x5^y\) 的贡献就是 \(0\) 了。

T4 formalized

考虑离线且 \(x=1\)。直接的做法是笛卡尔树上启发式分治,但无法推广。考虑将答案画到二维平面上,并将 \(x=i\) 向下平移 \(i\) 个单位,则可以变成矩形加,查询斜线和,离线情况下斜线是一条直线。

如果能维护套 \(m\) 个元素的单调栈,那么直接利用上面的做法就可以解决离线的问题。扫描线,过程中维护推广到 \(m\) 的单调栈。每次加入一个元素会修改栈顶开始的一段元素,暴力做修改过程实际上是 \(O(nm)\) 的。考虑修改过程中如果相邻两个元素相同就合并起来,定义一个元素的差异度为它和下一个元素不同的个数,势能为整个过程中差异度之和,每次修改到长度 \(>m\) 的后缀时,相邻两个元素会删去一个不同的数(第 \(m\) 大,这一定是不同的),加入一个相同的数,差异度会下降 \(1\),而差异度只会增加 \(O(1)\),于是对长度 \(>m\) 后缀的势能分析是 \(O(n)\) 的。对于 \(\leq m\) 的后缀显然复杂度是 \(O(nm)\)

考虑离线,此时斜线仍然是一条直线,需要做 \(O(nm)\) 次矩形加和 \(O(c)\) 次斜线查,分块平衡到 \(O(nm+c\sqrt n)\)。在线还不会做。

贪心专题

CF2085F2 Serval and Colorful Array (Hard Version)

考虑钦定了哪些位置上的数在答案中出现,那么最优的方案就是全都往中位数移动。钦定中位数位置,记 \(i\) 在左侧的第一次出现为 \(l_i\),右侧第一次出现为 \(r_i\),那么答案形如 \(\sum\min(l_i,r_i)-c\),容易发现中位数的限制可以放缩掉。\(\min(l_i,r_i)\) 在移动过程中变化量绝对值不超过 \(1\),同时整个变化量会是 \(O(n)\) 段连续段,差分维护。

AGC045B 01 Unbalanced

画出折线图,要求最小化极差。钦定最大值,将所有 ? 定成 -1,此时可以贪心做整个问题:找到最靠前的合法位置进行反转。于是扫描一遍即可线性做一轮求答案,枚举所有最大值后可以做到平方。注意到,设 \(M\) 为最大值是 \(M\) 时的最小值最大是多少,答案为 \(\min(M-f(M))\),有 \(f(M+2)\leq f(M)+2\),道理考虑 \(M+2\) 时的形态,把最靠前的反转即可。于是只需找到最小的 \(M\),即最大值最小是多少。时间复杂度 \(O(n)\)

CF2084F Skyscape

容易发现可以交换相邻的逆序对。考察判定,必要条件是 \(a\) 的顺序对在 \(b\) 中也是顺序对(\(b\) 的顺序对仍然一直会是顺序对),这也是充分的。考虑构造,枚举 \(1\sim n\),当 \(a_i\neq b_i\) 时,此时 \(b_i>a_i\),做操作 \(l=i,r=pos_{b_i}\),若 \(a\) 的顺序对在 \(b\) 也是顺序对,则必然可以做该种操作。

先对 \(c\) 中固定的数判断是否合法。考虑不确定的数和确定的数之间的限制,

炼石计划24

T4 最短路

\(f_i\) 代表 \(i\) 的答案,一种情况是 \(i\) 周围有断的边,这种情况显然是去 ban 掉最短路,于是 ban 掉 i 在最短路树上到父亲的边,求出新的最短路;另一种情况没有断的边,此时枚举邻居取 \(\min(f_j+w_{i,j})\)。一个问题是此时确定了 \(i\) 周围的边不断,可能会对答案产生影响,但这样只会把答案算劣。

\(f\) 的转移在求出新最短路后可以写成 dij 的形式,此时瓶颈在于求新的最短路。可以发现断掉 \(i\to fa_i\) 之后新最短路一定只会经过一条非树边,设为 \(y\to z\),则答案为 \(dep_z+dep_y-dep_x+w_{y,z}\),限制是 \(y\) 在子树内,\(z\) 在子树外。枚举每条非树边,则会对一段路径上的点做 chkmin,树剖维护。时间复杂度 \(2\log\)

注意到每条边的权值都是固定的,于是从小到大扫描,将路径上所有没被覆盖的点覆盖即可,树上并查集维护,时间复杂度 \(1\log\)

杂题选讲 11.17

CF2165D Path Split

看上去不太能直接做。对于 \(i<j,|a_i-a_j|=1\) 连边 \(i\to j\),则要求 DAG 最小链覆盖,转成求二分图最大匹配。根据 Hall 定理,二分图最大匹配为对于所有左部点集合的子集 \(|S|\)\(n-\max(|S|-|N(S)|)\)。首先这是上界,对于任意 \(S\),整个匹配必有至少 \(|S|-|N(S)|\) 个点不被匹配。由霍尔定理可以取到这个界。

注意到题目中二分图的优秀性质是只有对应 \(a\) 奇偶性不同的 \(ij\) 才会有连边,于是两部分独立。分别做 dp 即可。

QOJ14810 Trajan

错误做法对于所有情形都使用了 low 来更新 low,而这种做法在边双中是正确的,于是需要考虑是点双而不是边双的情形。经典例子是恰好有一个公共点的两个简单环,考虑这种结构,容易发现一定会将割点判错。于是只需考察是否有这种结构,简洁的判定形式是 \(u\) 是割点,且在至少两个点双中,两个点双至少分别有两条边连接 \(u\)。还需要特判两个点一条边的结构。

MX-S12

T4 Sea,you again

考虑 \(L=R\),一个比较显然的做法是从低位往高位 dp,需要记录当前合并的位数,决策点只有 \(O(1)\) 个,在 \(L<R\) 时可以状压。但由于需要记录合并位数看上去非常没有希望,从高位往低位做,可以发现当前考虑的位一定是贪心合并上面的位。基于此数位 dp 可以做到 \(O(B^2nR)\),需要枚举当前位填什么,可以用带系数的前缀和优化至 \(O(nR\times B)\)

炼石计划27

T3 needle

基于比较的问题请转化为 01 进行研究。

T4 reincarnation

考虑经典转化,要求相邻两个点不能在同色连通块中。问题在于一个点可能在两个不同色的连通块中,这个结构类似点双,于是建出形如圆方树的结构。同色连通块建点,包含公共点的两个连通块之间连边,非公共点向包含其的连通块连边,此时新树的每条边就是原树一个点。变为要求决策边的排列使得相邻边没有公共点。容斥,考察一段不合法边的形态,可以发现必为毛毛虫。毛毛虫的经典判定是每个点周围度数 \(>1\) 的点不超过 \(3\) 个。基于此做树形 dp,非常困难。

杂题选讲 11.24

QOJ14950 Relay Jump

操作非常难以刻画,在给出始末状态的前提下尝试寻找操作中的不变量。不变量的形式应尽可能简洁,且鲜少与操作数相关,猜测每只青蛙对不变量的贡献只有坐标向量乘上一个系数。而当前不被激发的青蛙之间没有区别,所以其系数相同。即形式为 \(k_0\sum\limits_{i\neq s}p_i+k_1p_s\)。假设跳跃被刻画为 \((s,t)\),则有 \(k_0(p_s-p_t)+k_1(p_s-p_t)=0\),得到 \(\frac{k_1}{k_0}=-1\),于是不变量为 \(\sum\limits_{i\neq s}p_i-p_s\)。可以直接求出答案。

QOJ14949 The Echoes of Chronos

不难得到转化,答案为 \(m\) 减去值域上加入 \(v\) 后相邻两个数间隔的最大值。这个信息难以通过合并维护,因此考虑莫队。注意到删除一个数总是可以通过链表维护,但加入不好做,因此回滚莫队,只不过变成了只有删除没有加入。注意到最后还需加入 \(v\) 维护答案。基于观察的做法是,莫队过程中维护间隔的最大和次大,加入 \(v\) 后容易求出答案,但删除数时若合并最大和次大不好维护新的次大。注意到如果在合并最大和次大后立即插入 \(v\) 求答案,则答案必定来源于新产生的这一段间隔,原因在于此时最大值长度至少为其它段的两倍。因此合并最大和次大的情况可以直接将次大值清空。时间复杂度 \(O(n\sqrt n)\)

考虑若 \(v\) 此前未被删除,则仍可以只维护最大值。考虑对于当前块中所有询问的 \(v\),全部加入莫队维护的信息中,回答询问时再删去无用的 \(v\)。若一个块中有 \(K\) 个询问,则额外时间复杂度为 \(O(K^2)\),因此去平衡一个块中的询问数量,同时仍需注意莫队块长不可失衡。不妨考虑序列 \(1\sim n\) 加上所有询问的 \(l\),对这个序列按照 \(B\) 的块长分块做莫队,复杂度可以放缩至对一个长为 \(n+q\) 的序列做莫队。

QOJ14944 Play It by Ear

考虑 \(2n\) 张牌固定时如何求答案。我们可以有一个下界,令 \(f_i\) 代表前 \(i\) 个任务完成的最小时间,\(j\) 为上一个满足 \(a_i=a_j\) 的任务,当 \(j\) 存在时,\(f_i=1+\min(f_{i-1},f_j+n)\);不存在时,\(f_i=1+\min(f_{i-1},\max(pos_{a_i}-n,0))\),这个下界可以通过构造得到,下界要求了能完成任务时必须立刻完成,于是一大难点是如何处理 \(a_i\) 仍在牌堆中时应该往里面扔哪些牌,显然先把没有任务的牌全都扔出去,此后假设手中存在 \(j,k\)\(k\) 此后的第一个任务更晚一点,则先扔 \(k\) 一定更优,一定能满足下界。考虑取出最优的 \(k\) 进入牌堆后,手上 \(n-1\) 张牌一定都早于 \(k\),再加上 \(i\) 这次操作,\(n\) 次后 \(k\) 一定会回到手中。

牌堆不固定时,将期望转化为 \(\sum\limits_{x}P(ans>x)\)。改为求 \(P(ans\leq x)\)。容易倒推,会对每个 \(pos_{a_i}\) 产生 \(\leq x+c_i\) 的限制,其中 \(c_i\) 是和 \(x\) 无关的常数,此时求方案数是经典的,从小到大满足限制即可。处理出常数 \(c_i\) 后可以 \(O(n)\) 求出单个 \(x\) 对期望产生的贡献。实际上可以 \(ans\) 的取值只有 \(O(n)\) 种,首先取值是连续的,考虑上界即为所有 \(pos_{a_i}=2n\),下界为 \(pos_{a_i}=0\),两个界最后产生的间隔也是 \(O(n)\) 的。

QOJ14942 Buggy Painting Software II

一个想法是前 \(m\) 个数按顺序填,接下来 \(m\) 个数是前面数做 \(x\) 的循环移位。这样在 \(m\) 是质数的情况下可以唯一确定一个 \(x\),若无法确定,则相当于存在一个 \(k\),使得染色的位置做 \(k\) 的循环移位后得到的位置仍然染色,当 \(\gcd(k,m)=1\) 的前提下一定会跳过每一个位置,因此必须全染或全不染。还有 \(m\) 个位置没有用上,考虑使用那些位置来增强构造。

集训队作业

2.Giant Penguin

考虑 \(k=0\)。直接做不好做,对时间轴 cdq 分治,建出虚树转移可以做到 \(2\log\),但这个做法极度依赖树的形态。考虑点分治,数据结构维护时间轴。\(k\neq0\) 等价于每个点最多被不超过 \(k\) 条返祖边经过。点分治时完全位于子树内的非树边数量不超过 \(k\) 条,只关注这些边,至于不完全位于子树内的路径会在别的分治中被考虑。维护 \(2k+1\) 个点的单源最短路,数据结构统计贡献。时间复杂度 \(O(n\log^2 n)\)

14.Local Maxima

钦定 \(i\) 个位置是 local maximum,二项式反演得到 \(ans=\sum\limits(-1)^{i-1}\times i\times f_i\)。写一个 dp 可以做到 \(O(nm\min(n,m))\)。注意到可以递推,即记录对于 \(i\times i\) 矩阵,存在 \(i\) 个 local maximum 的方案数,注意到从小到大加入 local maximum 不重不漏,预处理组合数后可以 \(O(1)\) 完成递推。时间复杂度 \(O(nm)\)

101.String Rank

\(i\) 后缀只需要和 \(i-1\) 后缀进行比较,此时 \(w_i\) 必选。找到 \(i\) 之后 \(w_i\) 的第一次出现 \(p\),即要求找到一个最短的串使得其不在 \(p+1\) 后缀中出现,但在 \(i+1\) 后缀中出现,贪心解决这个问题。整个过程都可以在 \(O(n\sum)\) 时间内维护。类似子序列自动机状物。

114.Best Subsequence

二分答案,注意到 \(\leq\lfloor\frac{mid}2\rfloor\) 的数必选,否则可以调整,基于此 dp 即可。或者注意到最小值必选,从那里断开呈链,也可以直接 dp。

posted @ 2025-11-04 21:09  BYR_KKK  阅读(59)  评论(0)    收藏  举报