广州市赛 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\),此时的最大匹配。转移为:
我们发现这个 \(\max\) 放到 DP 里很不好处理。
考虑很难的一步,令 \(d_u=f_{u,1}-f_{u,0}\),我们考察 \(f_{u,0}\) 和 \(d_u\),此时转移变为:
可以发现 \(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\),显然
对于 \(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}\),注意还要满足
也就是 \(x\leq m+c_{i,2}\)。
于是可以得到
还需要计算出 \(g_i(x)\) 表示令第 \(i\) 行恰好有 \(R_i=x\) 的最少公开位置数。
若 \(K=1\),则
若 \(K=2\),我们先尽量用 \(0\),设 \(x=\min(c_{i,0},\left\lfloor\dfrac{2m-x}{2}\right\rfloor),y=2m-x-2x\),则
固定 \(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\),定义
对于每个点 \(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})\)。

浙公网安备 33010602011771号