注意,本博客的任何内容不应被滥用、随意转载。

坐电梯 2026.7

啊是,真的很久没有写坐电梯了。这里前四题是 6 月写的。

P16910 「MierOI R2」靈

普通 dp 技巧题。

拆贡献,考虑 \(a_i\) 有多少种方案不在 \(C\) 中。

第一种:留在 \(A\) 里。只需保证 \(1,2\) 操作不超过 \(i-1\) 次。

第二种:留在 \(B\) 里。需要确认有 \(i-1\)\(1,2\) 操作、一次 \(2\) 操作。然后,要求接下来 \(3\) 操作总是不超过 \(2\) 的次数。假设将 \(a_i\) 放入 \(B\) 的是操作 \(o_j\),一个简单的方法是记 \(g_{x,y,z}\) 表示完成 \([j,x]\) 的决策后,\(A\) 队列剩余 \(y\) 个元素、\(2\)\(3\) 操作多 \(z\) 次的方案数,然后直接进行一次 \(\Theta(mn^2)\) 的 dp,复杂度为 \(\Theta(m^2n^3)\)

不过,起点和终点自定义以来就是不平等的。由于共 \(nm\) 个起始状态所受转移流程完全一致,一同赋入初值后一轮 dp 即可同时完成。

P10231 COCI 2023/2024 #4 Putovanje

图论启发题。

一个暴力是对每个 \(st\) 求单源最短路(边权为 \(1\))后判定 \(\operatorname{dis}(st,u)=d_u\)

我想你还记得——刚刚才告诉你的——起点和终点自定义以来就是不平等的。

把所有路径反过来考虑。要求 \(\operatorname{dis}(st,u)-d_u=0\),即令全体 \(u\)\(-d_u\) 的初值求得最短路 \(\operatorname{dis'}(u,st)=0\)。在运行多源最短路时用 bitset 记录可取得目前最短路的源点集。由于初值不同,需要在 bfs 过程中加点。

最后,\(dis_{st}=0\) 且 bitset 有全集者为答案。

我们需要将判定信息从多个点收录到一个点,因此选用多源而非单源。

CF1311E Construct the Binary Tree

常规构造题。

首先对局面进行量化,尝试判定无解。如果 \(D=\sum d\),那么 \(\min D\) 在完全二叉树中取到,\(\max D\) 在链中取到。猜测 \(m\in[\min D,\max D]\) 时有解。记录 \(m-D=m'\),当 \(m'=0\) 时构造完毕。

从完全二叉树开始,例行连续值域构造。钦定左链 \(1\to2\to4\to8\to\cdots\to2^x\),设链底部为 \(j\),初始有 \(j=\operatorname{highbit}(n)\)。从下至上枚举链外点 \(u\),允许 \(m'\overset-\gets[d_t,d_j]+1-d_u\)默认操作 \(m'\overset-\gets d_j+1-d_u,j\gets u\),将 \(u\) 拼接在 \(j\) 下方。当 \(m''<0\) 时,将 \(j\) 上移至 \(j'\) 使得 \(m'=d_{j'}+1-d_u\),将 \(u\) 作为 \(j'\) 的另一个子结点,随后结束构造。

我挺喜欢这种“大步小步”算法——对一个量化目标操作时,如可容忍即全部施加,否则手动操作后退出。tdpcG 辞書順P3975 弦论 等等各种各样的题目中皆有体现。此记权作警示。

孤杖急启人(watcher)

倍增练习题。

是的,是的我知道杀戮尖塔这款游戏。如果你不知道的话,题目所指是游戏中故障机器人这一角色。

这道题很像是复杂的数据结构题,可以考虑区间信息合并

出于 \(x\le 3\),无法出牌时一定有 \(s<3\)。此处启发我们按无法出牌的位置分割序列。

尝试倍增建表,\(f_{i,j,s,t}\) 表示以 \(s,t\) 为初始状态(能量、姿态)是否可以打出 \([i,i+2^j)\) 内的所有牌。由于单调性改为 \(f_{i,j,t}\) 表示初始姿态为 \(t\),打出区间内所有牌所需最小初始能量。

求出 \(f\) 后,仍受无效位分割,需要二次倍增跳无效位。设 \(g_{i,j,s,t}\) 表示以 \(s,t\) 为初始状态(能量、姿态),出牌直到第 \(2^j\) 个无效位后,剩余能量、最终姿态、造成伤害等。\(g_{i,0}\) 可以由 \(f\) 求出。

询问时,先用 \(g\) 跳完无效位,然后用 \(f\) 跳完后缀,统计伤害。

人们有时会有思维惯性:用了这个就不能用那个、这个也不能再用。为了破除它,这里还有一道需要二次容斥的题目 AGC041F Histogram Rooks


相信某种意志会将某些火焰带回。

P11844 [USACO25FEB] Friendship Editing G

图论启发题。

考虑补图。

题意可以完全转化为:操作允许删除、加入任何边,当不存在边 \((a,b)\) 时,对于任意点 \(c\),不能同时存在边 \((a,c),(b,c)\)

两个提示:若两命题有 \(p\to q\),则 \(!q\to !p\)。边的存在性易传导时,注意团的存在。

题意再次转换为:若同时存在 \((a,c),(c,b)\),必须存在 \((a,b)\)。故补图最终是若干个团。

由此,状压 dp。每次选中一个点集改造为团。

P3076 [USACO13FEB] Taxi G

经典题。

对于每一段路程 \(i\leftrightarrow i+1\),试图计算它被经过次数的下界。设 \(l_i\) 表示走过 \(i+1\to i\) 的独立次数下界,即形如 \(b\to a(a<b)\) 且覆盖该段的任务数;类似定义 \(r_i\)

加之最终需要到达数轴右端,实际下界 \(L,R\) 应有 \(R_i\ge r_i,L_i\ge l_i,R_i=L_i+1\)。综合得知经过次数下界 \(C_i=2L_i+1=2\max(r_i-1,l_i)+1\),离散化差分统计。

为什么一定能取到下界?没有为什么,出于问题简单表述的应有简洁形式。

P11288 [COTS 2017] 模板 Z1

普通 dp 技巧题。

找个地方入手。为每个数确定一个上界 \(lim_i\),题目限制转为:区间 \([l_i,r_i]\) 中必须存在一个 \(a_j=x_i\)。这样,两个限制如果 \(x\) 不相等就是独立的。分别求解相乘。

对于限制的一类 \(x\),提出所有 \(lim=x\) 的位置 dp。正如许多需要线段树辅助的 dp\(f_j\) 被定义为确定 \([1,i]\) 前缀、最后一个顶到上界的位置为 \(j\) 的方案数。满足限制的方法是:dp 到达 \(i\) 时,对于所有 \(r_k=i\) 的限制令 \(f_{1\sim l_k-1}\gets 0\),非常经典(尽管我忘记了,因此本文可能存在以复健为目的的内容)。其它转移比较容易。

P14422 [JOISC 2014] 水壶 / Water Bottle

图论启发题。

你知道 Voronoi 定理吗?这是这题想要告诉你的。对于图的一个点集分割 \((S,T)\),连接 \(S,T\) 的所有边中最短的那些一定有至少一条被 MST 选中。这实际上很显然。

我想这是错的,理应用类似三角形不等式的东西证明。

在这题中,可见一张完全图,边 \((i,j)\) 的权值为建筑 \(i,j\) 的最短路。希望建出这张图的重构树。

从所有建筑物起做多源 BFS,记录离每个点 \(u\) 最近的源点 \(c_u\) 及此距离 \(d_u\),这张图实际上被染色。只对颜色交界处的边 \((u,v),c_u\not=c_v\),将 \(d_u+d_v+1\) 加入 MST 的候选边集。此时候选边数只有 \(HW\)这是 Voronoi 定理在 \(S=\{i\}\) 时的运用。

你应该注意到了,这件事在一般非负图上也办得到。

P11321 [NOISG 2020 Qualification] Relay Marathon

图论常规题。

特殊点之间两两最短路最小值可以用二进制分组求出,或者用上题类似方法求出。总之现在获得了取到这个最小值的特殊点对 \(X,Y\)

\(X,Y\) 一定同时在答案四个点之中。如果同时不存在,替换一对点更优。如果只存在一个,用另一个与之匹配更优。答案一定是 \(((X,Y),(A,B))\)\(((X,A),(Y,B))\),以 \(X,Y\) 为起点分别求前 \(3\) 近的特殊点即可。

有点像假期计划

P7600 [APIO2021] 封闭道路

比较复杂的 dp 技巧题。

枚举 \(k\),这里有一个暴力:设 \(f_{u,1/0}\) 表示 \(u\to fa_u\) 是 / 否钦定被删除时,使 \(u\) 的子树满足题意的最小代价。转移和平常 dp 不太一样,但还算简单。对于 \(f_{u,i}\),先默认选 \(\sum \min(f_{v,0},f_{v,1}+w)\),然后选前 \(\max(0,d_u-k-i)\) 小的 \(f_{v,1}+w-\min\),即反悔贪心。用堆维护。

这样做是 \(\Theta(n^2\log n)\) 的,但是实际上 \(d_u\le k\) 的点可以特别处理。当一个点初始即合法时,将其删除,此时树被分割成森林,连通块相互独立。对于一个连通块,周围删除的点可以被认为是 \(f_{u,0}=f_{u,1}=0\) 的叶子,故当一个点被删除时向周围点的堆分别加入边权 \(w\)

注意,实现最好用对顶大根堆,弹出到剩余 \(d_u-k-i\) 个值,维护堆中和。这是因为 \(k\) 递增枚举,应该使堆中点数不断减少,否则复杂度容易(一说必然)假。

令我想起AT_pakencamp_2024_day2_b Biscuit and Ants

X24763 01 的流星

image

image

常规推论简化题。

这题有一个严格加强版:P16435 集宝,难度确实比较高,我还没有做。

不过,面对这个弱化版,有一个更聪明的做法。考察序列结构:

结论 1. \(p\) 的连续下降 / 上升段 \(p_1,p_2,p_3\) 中,\(p_2\) 没有意义。

这点非常容易证明。从 \(p_1\) 移动到 \(p_3\) 的过程中,\(p_2\) 一定被经过。所以,将 \(p\) 改造为交替升降。

结论 2. 对于 \(k=\arg \min\limits_{1<i<n-1}|p_i-p_{i+1}|\),如果 \(|p_{k}-p_{k+1}|\le len\),对于当前询问,\(p_k,p_{k+1}\) 可删除。

这时,若 \(p_k<p_{k+1}\),有 \(p_{k-1}>p_{k+1}>p_k>p_{k+2}\)(结论 1.),从 \(p_{k-1}\) 移动到 \(p_{k+2}\) 的过程中, \(p_k,p_{k+1}\) 同时被经过,一并删除。事实上,当 \(k=1,n-1\) 时需要一些不同的删除方法。

那么,对询问按 \(len\) 升序排序,按照结论 2. 删除 \(|p_i-p_{i+1}|<len\) 的所有位置。此时 \(p_i\to p_{i+1}\) 所需操作数为 \(|p_i-p_{i+1}|-len\),容易统计。以上步骤可以用 set 和链表实现。注意开头的 \(2\) 段操作有一点特殊,可以用暴力解决避免分讨。

X23898 01

image

image

Undefined

注意到本题并没有要求解决原问题,实际上 \(n\) 个分割串 \(\{s_n\}\) 之间的顺序没有意义。尝试贪心地解决 \(A=B=1\) 的特殊性质,可能会碰壁,但深入思考可以猜到 \(|s_i|\le \log n+\epsilon\)

考虑建出一颗 01trie,每个点向左下、右下的边权分别是 \(A,B\)。接下来的任务是:选出 \(n\) 个没有祖先后代关系的点,最小化到根路径长度和。可以想到一个扩张算法,维护类似 Dijkstra 的东西:先将 trie 的根加入小根堆,每次选中一个到根路径最短的点,向子结点扩张为两个点,直到堆中有 \(n\) 个点。

当然,不可以直接扩张 \(n\) 次。由于边权只有 \(10\),加上 \(|s_i|\le 60\) 的结论,到根路径最长只有 \(\max(A,B)\log n\le 600\)。用桶手动扩张做到 \(\Theta(600T)\)

P4082 [USACO17DEC] Push a Box P

图论转化题。

可见人只有站在箱子旁边才有意义。因此设定状态 \(d_{x,y,4}\) 表示箱子在 \((x,y)\) 而人在祺四个方向之一。转移枚举推箱子和换站位。

换站位并没有那么容易。考虑人在 \((x,y+1)\),让箱子待在原地,随后前往 \((x-1,y)\)。如果能够到达,原图上人到新站位实际上至少有两种走法:\((x,y+1)\to(x,y)\to(x-1,y)\)\((x,y+1)\leadsto(x-1,y)\)。如果两站位在同一个点双内,这一定可以实现;否则,箱子在一个割点上,不可能实现。

建出圆方树辅助 BFS。

P16458 [UOI 2026] mex plus

经典题。

正如题解所说,“卡牌两面”问题有一类思路是将每个可选对 \((x,y)\) 连边 \(x\leftrightarrow y\),随后据题意对边定向以表出方案(比如指向 \(x\)\(x\) 加入 \(A\))。这里还有一个好处是每个值作为一个点在图中出现,可以将 \(\text{mex}\) 转为补集 \(\min\)。设 \(A,B\) 的补集分别是 \(A',B'\)

考虑一个连通块。连通块中所有叶节点(度数为 \(1\))总是恰好加入 \(A',B'\) 中的一个,不妨将最小叶节点加入 \(B'\),这时允许将其它叶节点一并加入而无影响。对于其它节点,如果连通块中有环,全部能同时加入 \(A,B\),无影响;否则形态为树,恰有一个点只能加入一个集合,令编号最大点加入 \(A'\)

单自环、孤立点需要特别处理。

可以用线段树分治、并查集和 set 维护图结构。

P8456 「SWTR-8」地地铁铁

常规图论题。

认为 \(D,d\) 表示黑白两色。反过来考虑非法点对(任何路径纯色)数量。简单路径“不可以经过重复节点”,一定程度上提醒点双连通分量

所有点双中,只有三种本质不同形态:

  1. 内含的所有边全黑或全白,任何点对非法。
  2. 只存在两处黑白边交界点,只有这两点组成的点对非法。
  3. 存在两处以上交界点,任何点对合法。

点双内部计数完毕,考虑经过割点的路径。建出圆方树,即求只经过同色 1. 类点双的路径数。简单 dp 统计。

P15245 [WC2026] 二进制

经典题。

似乎很常见的 \(2x+1\) 模型。可以获得两个思考:\(y\gets 2y\) 是不必要的;\(x\gets x+1\) 可以在所有 \(x\gets 2x\) 结束后以 \(x\gets 2^k\) 的形式进行。

考虑先令 \(x\gets 2^d x\),若 \(2^{d-1}x\ge y\)\(2^{d+1}x\le y\) 则一定不优。

  • \(2^dx>y\),答案为 \(d+2^dx-y\)
  • \(2^d x\le y\),设 \(k=y-2^dx\),可以在此前的 \(d\)\(\times 2\) 中插入 \(+1\) 使 \(k\gets k-2^t(0\ge t\le d)\)。然而,\(y+1\) 操作仍然有用。这时答案为 \(\min\limits_{i\le 60} i+\lfloor\dfrac{k+i}{2^d}\rfloor+\operatorname{pop}(k\bmod 2^d)\)。可以见得,\(i\) 存在的意义是通过进位减少 \(k\)\(\operatorname{pop}\),而这只和 \(k\) 的最低 \(6\) 位及 \([6,d]\) 中前缀连续 \(1\) 的数量有关。允许预处理。

我卡不过去,贺的题解。

P16409 [Algo Beat Contest 004 E] Elusive Prime

不确定性算法题。

考虑这样一件事:一个正整数 \(a\) 同时是 \(\bmod p_1,p_2\) 意义下的二次剩余的概率接近 \(\dfrac12\)

随机取出 \(17\) 个数 \(\{f_{17}\}\)以此哈希。对所有 \(\le 10^6\) 的质数手动算出勒让德符号并压成 \(17\)\(3\) 进制数,然后通过询问算出答案的哈希值,比对即可。多交几发才能过。

P10063 [SNOI2024] 平方数

不确定性算法题。

考虑一个真实的完全平方数 \(x^2\),它对于任意 \(x\perp P\) 的模数 \(P\) 一定都是二次剩余

随机取出 \(40\) 个不能整除任何 \(a\) 的质数,然后求出 \(a\) 的前缀积 \(\{s_n\}\),区间 \((l,r]\) 的积是 \(P_i\) 的二次剩余要求 \(\dfrac{s_r}{s_{l}}^{\frac{P_i-1}2}\equiv 1\pmod {P_i}\)。那么,声称 \(\dfrac{s_r}{s_l}\text{是完全平方数}\Leftrightarrow \forall i,s_r^{\frac{P_i-1}2}\equiv s_l^{\frac{P_i-1}2}\pmod {P_i}\)。哈希容易找到所有解。


我现在觉得,算法竞赛是一款非常有意思的游戏。我怎么没早点发现呢??

posted @ 2026-07-27 21:16  Sheez  阅读(6)  评论(0)    收藏  举报
要想见证尘封的秘密,就要承受最严厉的惩罚。