广州市赛 2026 题解

D1T1

题意

给你长度为 \(n\) 的序列 \(a\)。有 \(q\) 次操作,每次操作给出 \(l,r\),求将 \(a[l..r]\) 反转后,\(\sum_{i=1}^{n-1}\max(a_{i+1}-a_i,0)\) 的值。操作相互之间独立。

\(1\leq n,q\leq 10^5\)

前缀和,\(\mathcal{O}(n)\)

D1T2

题意

给你一棵 \(n\) 个点的树,第 \(i\) 条边有两个边权 \(a_i,b_i\)。你可以选择一个边集 \(E\),若 \(i\in E\) 则边 \(i\) 的边权为 \(a_i\),否则为 \(b_i\)。对于一个边集,定义其权值为:从 \(E\) 中能选出的最大匹配的边数,乘上所有边的边权。求所有 \(2^{n-1}\) 种边集 \(E\) 的权值和。答案对 \(998244353\) 取模。

\(1\leq n\leq 10^5\)

回顾树上最大匹配的 DP,用 \(f_{u,0/1}\) 表示考虑 \(sub_u\) 内的点,是否选择点 \(u\),此时的最大匹配。转移为:

\[\begin{align*} f'_{u,0}&\gets f_{u,0}+\max(f_{v,0}, f_{v,1})\\ f'_{u,1}&\gets \max\begin{cases} f_{u,1}+\max(f_{v,0},f_{v,1})\\ f_{u,0}+f_{v,0}+1 & \text{if }(u,v)\in E \end{cases} \end{align*} \]

我们发现这个 \(\max\) 放到 DP 里很不好处理。

考虑很难的一步,令 \(d_u=f_{u,1}-f_{u,0}\),我们考察 \(f_{u,0}\)\(d_u\),此时转移变为:

\[\begin{align*} f'_{u,0}&\gets f_{u,0}+f_{v,0}+\max(d_v,0)\\ d'_u&\gets \max\begin{cases} d_u\\ 1-\max(d_v,0) & \text{if }(u,v)\in E \end{cases} \end{align*} \]

可以发现 \(d_u\) 只能取 \(\{0,1,-\infty\}\) 中的数,于是设计 \(dp_{u,0/1/-\infty}\) 表示考虑 \(sub_u\) 内的点,\(d_u=0/1/-\infty\) 时的权值和。转移形如把 \(\sum\prod ax\)\(\sum\prod by\) 合并成 \(\sum\prod (a+b)xy\),额外记录 \(g_{u,0/1/-\infty}\) 表示边权积之和即可。需要一些简单的分讨。

实际上这个 \(d_u=-\infty\) 只会在初始状态中出现,但是某人场上没带脑子。不管了。

时间复杂度 \(\mathcal{O}(n)\)

D1T3

题意

有一个 \(n\times m\) 的网格,\(a_{i,j}\) 表示第 \(i\) 个人在第 \(j\) 题上的得分,每个题满分都是 \(K\)\(0\leq a_{i,j}\leq K\)。冠军是在 \(m\) 个题上的总得分最小的选手,若得分相同则取编号较小的选手。现在你可以选择 \(a\) 上的若干个位置公开,其他位置隐藏。如果存在一种补全隐藏位置的方案,使得选手 \(i\) 为冠军,则称选手 \(i\) 为候选冠军。你需要最小化公开的位置数量,使得恰好有 \(r\) 个候选冠军,或报告无解。

\(1\leq nm\leq 10^5\)\(K\in \{1,2\}\)

公开若干位置后,设第 \(i\) 行总分的最小和最大可能值分别为 \(L_i,R_i\)。考虑取 \(p=\arg\min\limits_i(R_i,i)\),那么 \(p\) 必然是候选冠军。进一步地,对于 \(i\neq p\)\(i\) 是候选冠军当且仅当 \((L_i,i)<(R_p,p)\),证明显然。这样我们就把行之间的限制消掉了。

现在考虑固定 \(p\)\(R_p\),反过来考虑,我们想让 \(r'=n-r\) 个人不是候选冠军,那么对于 \(i<p\),我们要让 \(L_i>R_p\land R_i>R_p\),对于 \(i>p\),我们要让 \(L_i\geq R_p\land R_i\geq R_p\)。对于没有被排除的位置,我们不公开任何位置,从而使 \(L\) 取到 \(0\)\(R\) 取到 \(km\)。注意特判:若 \(R_p=0\)\(n-p\leq r'\),若 \(R_p=km\)\(p=1\)

考虑计算出 \(f_i(x)\) 表示要使第 \(i\)\(L_i\geq x\land R_i\geq x\) 的最少公开位置数。

\(c_{i,x}\) 表示第 \(i\) 行中 \(x\) 的数量。

对于 \(K=1\),显然

\[f_i(x)=\begin{cases} x&\text{if }c_{i,1}\geq x\\ +\infty &\text{otherwise} \end{cases} \]

对于 \(K=2\),我们一定是优先取 \(2\)。若 \(x\leq 2c_{i,2}\),则只需公开 \(\left\lceil\dfrac{x}{2}\right\rceil\) 个位置;否则必然是先取完 \(c_{i,2}\)\(2\),再取 \(x-2c_{i,2}\)\(1\),于是要满足 \(x\leq c_{i,1}+2c_{i,2}\),注意还要满足

\[R_i=x-2c_{i,2}+2(m-(x-2c_{i,2}))=2m-x+2c_{i,2}\geq x \]

也就是 \(x\leq m+c_{i,2}\)

于是可以得到

\[f_i(x)=\begin{cases} \left\lceil\dfrac{x}{2}\right\rceil&\text{if }x\leq 2c_{i,2}\\ x-c_{i,2}&\text{if } 2c_{i,2}<x\leq\min(c_{i,1}+2c_{i,2},m+c_{i,2})\\ +\infty&\text{otherwise} \end{cases} \]

还需要计算出 \(g_i(x)\) 表示令第 \(i\) 行恰好有 \(R_i=x\) 的最少公开位置数。

\(K=1\),则

\[g_i(x)=\begin{cases} m-x&\text{if }c_{i,1}\geq m-x\\ +\infty&\text{otherwise} \end{cases} \]

\(K=2\),我们先尽量用 \(0\),设 \(x=\min(c_{i,0},\left\lfloor\dfrac{2m-x}{2}\right\rfloor),y=2m-x-2x\),则

\[g_i(x)=\begin{cases} x+y&\text{if }y\leq c_{i,1}\\ +\infty&\text{otherwise} \end{cases} \]

固定 \(R_p\) 的值,从小到大扫 \(p\),我们只需查询多重集 \(S=\{f_i(R_p+[i<p])\mid i\neq p\}\) 的前 \(r'\) 小,使用树状数组维护即可。时间复杂度为 \(\mathcal{O}(Knm\log{m})\)

D1T4

题意

给定长度为 \(n\) 的序列 \(a\)\(q\) 次询问 \(l,r\),你需要求出从 \(r\) 跳跃到 \(l\) 的最小次数。设当前位置为 \(p\),一次跳跃定义为找出 \(|a_p-a_q|\) 最大的位置 \(q\in[l,p-1]\),若有多个这样的位置取最靠右的,然后令 \(p\gets q\)

\(1\leq n,q\leq 10^6\)

取出 \(a[l..n]\) 的前缀最小值位置和前缀最大值位置,不难观察到每次跳跃都会在两类位置之间交替走。取这些位置的并集 \(S\),考察一对相邻的位置 \(i<j\),若 \(i,j\) 都恰好只属于同一类位置,则令 \(w_j=0\),否则令 \(w_j=1\)。那么一个位置 \(p\) 的跳跃次数就是 \(\sum_{i\in S,i\leq p}w_i\)。从大到小扫 \(l\),维护两个单调栈,用链表维护 \(S\),树状数组维护 \(w\),查询时在单调栈上二分出 \(r\) 第一次跳到的位置即可。时间复杂度 \(\mathcal{O}((n+q)\log{n})\)

D2T1

题意

给你一个 \(n\times m\) 的网格 \(a_{i,j}\)。设当前得分为 \(b\),每一步你可以移动到四联通的格子 \((i,j)\) 上,然后令 \(b\gets (b+a_{i,j})^2\)。给你 \(s_x,s_y,t_x,t_y,w,q,p\),你需要求出,以 \(w\) 的初始得分,从 \((s_x,s_y)\) 走到 \((t_x,t_y)\),使得最终得分为 \(q\) 的最小步数,得分在模质数 \(p\) 意义下计算。特别的,步数 \(>16\) 算作无解。

\(1\leq n,m\leq 100\)\(2\leq p\leq 10^7\)

容易想到折半,从 \((s_x,s_y)\) 出发走 \(P\) 步,从 \((t_x,t_y)\) 出发倒着走 \(Q\) 步。倒着走需要求二次剩余,而模质数 \(p\) 意义下可能存在两个二次剩余,所以左侧状态数为 \(4^P\),右侧状态数为 \(8^Q\)。平衡一下,取 \(P=10,Q=6\) 最优。二次剩余 \(\mathcal{O}(p)\) 暴力预处理即可。如果用 unordered_map 时间复杂度为 \(\mathcal{O}(p+4^{P}+8^Q)\)

D2T2

题意

给你长度为 \(n\) 的严格递增序列 \(a\)。你需要将其划分为若干个长度大于 \(1\) 的等差子序列,并最小化这些子序列的公差的最大值。

\(1\leq n\leq 3500\)

二分转化为 check 答案是否 \(\leq mid\)。在所有满足 \(a_j-a_i\leq mid\) 的点 \(i,j\) 间连边,每个连通块都是 \(a\) 上的一个连续段。容易发现只需要保留长度为 \(2\)\(3\) 的等差数列。那么偶数长度的连续段显然合法,只需要对奇数长度的连续段做判定。

我们指出,若一个奇数长度的连续段合法,则必然存在一种划分只包含一个长度为 \(3\) 的等差数列。

证明

考察一个合法的划分,把每个等差数列里的点缩起来得到一个新的连通图。设长度为 \(3\) 的等差数列对应的点为特殊点,那么有奇数个特殊点。任取新图中的一棵生成树,取生成树中深度最大的特殊点从新图中删去,则未被删去的特殊点都在同一个连通块内,因此这个连通块内包含偶数个特殊点。对应到原图中,每个连通块的大小都是偶数,可以调整为两两配对。\(\Box\)

固定一个长度为 \(3\) 的等差数列后,剩余部分形成 \(4\) 个连续段,从左到右尝试合并连续段,合并后检查是否每个连续段都是偶数长度,这样即可 \(\mathcal{O}(1)\) check 一个长度为 \(3\) 的等差数列是否合法。而长度为 \(3\) 的等差数列可以固定中间点双指针求出。这样就可以 \(\mathcal{O}(n^2)\) check 了。时间复杂度为 \(\mathcal{O}(n^2\log{V})\)

D2T3

题意

Alice 和 Bob 在一个序列上玩游戏,Alice 先手。每一步,当前玩家需要执行下面的操作之一:

  • 删除序列中的一个元素。
  • 将序列打乱成先前没有出现过的顺序,不区分相同的值。

无法操作的一方失败。

Alice 和 Bob 都以最优策略操作。

给你一个长度为 \(n\) 的序列 \(a\)\(q\) 次询问 \(l,r\),你需要求出若在 \(a[l..r]\) 上玩游戏,哪一方会获胜。

\(1\leq n,q\leq 10^6\)\(1\leq a_i\leq n\)

不妨想想有道理的暴力。显然胜负只和 \(cnt\) 数组构成的可重集有关。进一步地,设一个可重集 \(S\) 的排列数为 \(f(S)=\dfrac{(\sum_{x\in S}x)!}{\prod_{x\in S}x!}\),那么每次执行完删除操作进入一个新的 \(S\) 后,若对 \(S\) 执行删除操作的后继状态有必败状态,则当前方必胜,否则当前方必败当且仅当 \(f(S)\) 为奇数。

经典地,由 Lucas 定理,\(f(S)\) 为奇数等价于 \(S\) 中元素二进制 \(1\) 位不交。

我们打表发现,先手必败当且仅当序列长度为偶数且 \(f(S)\) 为奇数。

证明

归纳证明。

\(f(S)\) 为偶数,由前面的分析,先手必胜。

若序列长度为偶数且 \(f(S)\) 为奇数,则删除操作的后继状态都是必胜状态,因此先手必败。

若序列长度为奇数且 \(f(S)\) 为奇数,则 \(S\) 中恰好存在一个奇数,选择这个奇数减 \(1\) 即可进入必败状态,因此先手必胜。\(\Box\)

考虑如何支持区间查询。观察到若 \(f(S)=1\),则区间内至多只有 \(\log_2(n)\) 种不同的数。令 \(pre_i\) 表示 \(i\) 前面第一个和 \(a_i\) 相同的位置,可以用 ST 表维护 \(pre\) 数组区间 \(\min\) 及其位置。对 \(r\) 从小到大扫描线,查询 \([l,r]\) 时暴力递归找出所有 \(pre_i<l\) 的位置,若找到了 \(>\log_2(n)\) 则提前退出;否则对于每个位置提前预处理 \(p_i\) 表示 \(a_i\) 是该值第几次出现,扫的过程中维护每个值的出现次数 \(c_v\),那么对于一个 \(pre_i<l\) 的位置 \(i\),其出现次数就是 \(c_{a_i}-p_i+1\),暴力 check 即可。

时间复杂度为 \(\mathcal{O}((n+q)\log{n})\)

fun fact:莫队维护区间 \(cnt\) 异或和过了。

D2T4

题意

给你一棵 \(n\) 个点 Trie,\(|\Sigma|=26\)

\(dep_{rt}=0\),其他点 \(dep_u=dep_{fa_u}+1\)

对于一个点 \(u\),定义 \(len_u=\max\limits_{v\in sub_u}dep_v\)。点有点权 \(a_u\),保证 \(a_{fa_u}>a_u\)。对于一个点 \(x\),定义

\[S_x=\{y\mid \operatorname{dist}(x,y)>len_y\land a_x\geq a_y\} \]

对于每个点 \(x\),求最少可以选出多少个不交子树,使得它们的并恰为 \(S_x\)

\(1\leq n\leq 5\times 10^5\)

显然问题可以转化为数 \(S_x\) 的连通块个数。考虑点边容斥,把边的 \(-1\) 贡献挂到上面的的点上,于是定义 \(b_x=1-|son_x|\),那么所求即为 \(\sum\limits_{y\in S_x}b_y\)

点分治,设 \(d_x\)\(x\) 到分治中心的距离,则限制变为 \(d_x>len_y-d_y\land a_x\geq a_y\),二维数点即可。时间复杂度为 \(\mathcal{O}(n\log^2{n})\)

posted @ 2026-09-19 19:44  P2441M  阅读(6)  评论(0)    收藏  举报