2025.9.19 NOIP 模拟赛 题解

比赛

订正

T1 P130015 项链 (necklace)

题意

长为 \(n\) 的环 \(a_{1\sim n}\),去掉 \(n-m\) 个数,求相邻数之和最大值的最小值,\(n\le5\times10^5\)

分析

二分答案 \(k\)\(\le\lfloor\frac k2\rfloor\) 的数必选,这些数把环分成若干段,每段中之多只能选择段内最小值,容易 \(O(n)\) 求出最多选择的数量,时间复杂度 \(O(n\log V)\)

代码

另一种方法是贪心,每次去掉相邻之和最大的一对元素的较大值,链表加堆维护即可,时间复杂度 \(O(n\log n)\)

T2 P130016 计树 (tree)

题意

一棵 \(n\) 点的二叉树,给定 \(l_{1\sim n},r_{1\sim n}\),要求点 \(i\) 的儿子数量在 \([l_i,r_i]\) 中(区分左右儿子),且若 \(i\) 不是叶子,则其编号最大的儿子 \(>i\),求方案数,\(n\le 300\),多测 \(T\le 3\)

分析

\(f_{i,j,k}\) 表示前 \(i\) 个点,构成 \(j\) 棵树,还有 \(k\) 个未确定儿子的方案数

显然 \(f_{0,0,0}=1\),答案为 \(f_{n,1,0}\)

考虑 \(f_{i,j,k}\) 的转移

若点 \(i+1\) 可以 \(0\) 个儿子,转移为

\[f_{i,j,k}\to f_{i+1,j+1,k}\\ k\cdot f_{i,j,k}\to f_{i+1,j,k-1}\\ \]

分别表示新建一棵树和挂在之前某个结点下

若取 \(1\) 个儿子,则转移为

\[f_{i,j,k}\to f_{i+1,j+1,k+1}\\ f_{i,j,k}\to 2k\cdot f_{i+1,j,k}\\ \]

分别表示新建一棵树和挂在之前某个结点下

若取 \(2\) 个,则转移为

\[f_{i,j,k}\to f_{i+1,j+1,k+2}\\ f_{i,j,k}\to k\cdot f_{i+1,j,k+1}\\ f_{i,j,k}\to 2j\cdot f_{i+1,j,k+1}\\ f_{i,j,k}\to 2(j-1)k\cdot f_{i+1,j-1,k}\\ \]

分别表示新建一棵树,挂在之前某个结点下,下面挂一个子树,下面挂一个子树且挂在一个子树下

时间复杂度 \(O(\sum n^3)\)

代码

T3 P130017 书信 (letter)

题意

给定两个字符串 \(S,T\)\(S\) 每个字符有权值,每次选择一种字符,删去 \(S\) 中其第一次出现位置或最后一次出现位置,求出使得 \(S\) 变为 \(T\) 所需删去的字符权值总和的最小值或判定无解,\(n=|S|,m=|T|\le2\times10^5,S_i,T_i\in\{\text a,\text b,\cdots,\text z\}\),多测 \(T\le3\)

分析

\(f_c\)\(T\)\(c\) 第一次出现,\(l_c\) 为最后一次出现

\(S_{1\sim i}\) 匹配 \(T_{1\sim j}\) 时,可以跳过 \(S_{i+1}\) 当且仅当 \(j<f_{S_{i+1}}\)\(j\ge l_{S_{i+1}}\)

对于每个 \(x=f_i/l_i\)\(T\)\(x\) 处断开(变为 \([\ast,x)\)\([x,\ast)\),则对于一个 \(S_{1\sim i}\) 和同一段中的 \(j\),要么同时能跳过 \(S_{i+1}\),要么同时不能

令第 \(i\) 个区间为 \([lp_i,rp_i]\),区间数量为 \(tot\)

\(dp_{i,j}\) 表示 \(S_{1\sim i}\) 匹配 \(T_{1\sim rp_j}\) 时删除字符权值和的最小值,则答案为 \(dp_{n,tot}\),初始 \(dp_{0,0}=0\)

第一种转移为

\[dp_{i,j}+w_{i+1}\to dp_{i+1,j}(rp_j<f_{S_{i+1}}\lor rp_j\ge l_{S_{i+1}}) \]

第二种转移为 \(dp_{i,j}+\ast \to dp_{p,j+1}\),其中 \(p\) 为满足 \(S_{(i,p]}\) 可匹配 \(T_{lp_{j+1}\sim rp_{j+1}}\) 的最小值,\(\ast\) 为该过程中需要删去的最小权值和

考虑如何计算 \(p\)\(\ast\)

转移时先枚举 \(j\)

此时对于一个字符 \(c\),若 \(rp_j<f_c\lor rp_j\ge l_c\),则 \(c\) 必然删去(否则必然无法匹配),否则必然保留

转移 \(dp_{i,j}\) 时,容易通过预处理 \(O(1)\) 得到第一个匹配 \(T_{lp_{j+1}}\) 的位置,选取之后的连续 \(rp_{j+1}-lp_{j+1}\) 个必选位置,若这些位置能匹配 \(T_{lp_{j+1}\sim rp_{j+1}}\) 则可以转移,检测的过程可以哈希实现

时间复杂度 \(O(\sum n|\sum|)\)

代码

T4 P130018 迷宫 (maze)

题意

给定一个 \(n\times m\) 的矩形,每个位置标有 \(\text{UDLR}\) 之一,从一个位置可以向除了它标着的方向外其余三个方向移动,\(q\) 次询问,每次给定两个位置 \((a,b),(c,d)\),求从 \((a,b)\)\((c,d)\) 可以经过的点数或判定无法到达,\(n,m\le10^3\)\(q\le3\times10^5\)

分析

首先 \(\text{SCC}\) 缩点,点权为对应 \(\text{SCC}\) 包含的点数

按拓扑序依次加入 \(\text{SCC}\),则任意时刻每个连通块都是凸的

证明:

  • 若某时刻一个连通块是凹的,假设 \((x-1,y)\)\((x,y-1)\) 属于连通块,\((x,y)\) 不属于连通块
  • 由于 \((x,y)\) 的四个相邻方向中只有一个没有出边,因此要么存在 \((x,y)\to (x-1,y)\),要么存在 \((x,y)\to (x,y-1)\)
  • 因此 \((x,y)\) 所属连通块在 \((x-1,y)\)\((x,y-1)\) 之前,矛盾

即平面上的若干矩形

假定允许连续若干连续排列且宽度一致的矩形暂时不合并(称为并排)

加入一个新的连通块 \(A\) 时,对于每个位于其外接矩形内的位置 \(p\)(实际只要枚举与 \(A\) 相邻的那部分即可),设其所属连通块为 \(B\),令 \(B\)\(A\) 连边,在并查集中将 \(B\) 并到 \(A\)

由此得到一个新的矩形,尝试与周围合并

枚举四条轮廓线,以上方为例

根据之前的结论,显然要么轮廓线上不存在相邻的连通块(假定拓扑序小于当前 \(\text{SCC}\)\(\text{SCC}\) 不存在),要么并上该方向上所有相邻的连通块后得到的为矩形(即这部分矩形依次排列且上下的宽度一致)

前一种情况直接跳过,对于后一种情况,对于其中任意一个矩形,要么最底下都是 \(\text{D}\),此时连向与左右的矩形,要么存在至少一个不是 \(\text D\) 的,此时连向当前矩形

即除非其中所有矩形底部都是 \(\text{D}\),否则它们都能到达当前矩形

新建一个虚点,令这一方向上所有矩形都连向该点,并在并查集中令它们都并到虚点上

此时该虚点代表一个与当前矩形并排的矩形

若其底部不完全为 \(\text D\),则令虚点连向当前点

由此得到一棵根向树,且部分兄弟之间存在连边,且这部分连边一定能拆为若干不交的链,不存在环

对于一次询问,在树上找到起点终点 \(u,v\),若 \(v\)\(u\) 浅则必然不可达,令 \(u\) 跳到与 \(v\) 同一深度,并将沿途经过的点上可达范围内的总数计入答案(容易预处理做到 \(O(1)\)),此时若两者不是同一父亲或无法通过兄弟链到达则无解,否则将中间一部分也计入答案

时间复杂度 \(O(nm\log nm+q\log nm)\),瓶颈在于跳 \(k\) 级祖先的部分

代码

比赛结果

\(100+45+10+16\)\(\text{rk}23\)

posted @ 2025-09-23 11:28  Hstry  阅读(28)  评论(0)    收藏  举报