联合省选 2021 题解
#9153. 卡牌游戏 (card)
把所有数不管正面反面扔到一个序列中排序,保留哪些数不好考虑,但是删掉一定是一段前缀和后缀。被删的数需要满足条件:
- 不能把一个位置正反面都删了
- 被删的正面数字 \(\le m\) 个。
我们希望保留区间长度尽可能小,双指针维护即可。
#9148. 矩阵游戏 (matrix)
钦定 \(b_{n,i} = b_{i,m}=0\),容易构造出不满足值域限制的 \(a\)。现在要给每个位置加上一个数,我们考虑如何操作才能保证四个位置的和不变,显然四个位置的变化量分别是 \(x,-x,x,-x\)。这可以将贡献拆分到每行每列,每行中相邻两数变化量互为相反数,列同理。通过将棋盘黑白染色,对行来说白色为变化量为正,黑色变化量为负,列反过来,就可以将问题转化为差分约束。
#9149. 图函数 (graph)
记 \(h(i,x)\) 表示对于 \(f(i,G)\) 来说 \(x\) 有贡献。讨论之后发现 \(h(i,x)\) 等价于 \(x\) 可以不经过 \([1,x)\) 中的点走到 \(i\)。这个描述很类似 floyd 的转移过程,所以我们真的用 floyd 求出两个点最早是在加入哪条边之后连通,做后缀和即可得到答案。
#9154. 宝石 (gem)
二分答案,把一条路径看成上行下行两段,上行段从前开始匹配,下行段从后开始匹配。对每个点分别处理它往祖先方向下一个应该匹配哪个点,分往前匹配和往后匹配。询问的时候先找到路径上应该匹配的第一个点在哪里,然后倍增。在线的话需要可持久化线段树维护每个值最后出现的位置,但是注意到上行路径只会从 \(P_1\) 开始匹配,因此可以离线。
#9155. 滚榜 (ranklist)
暴力 dp \(f_{s,i,j,k}\) 表示考虑集合 \(s\) 中的队伍,总和 \(i\),上一个队伍是 \(j\),上一个 \(b\) 是 \(k\)。但是我们只关心排名,而不关心 \(b\) 的具体取值,针对这一点可以想到通过某种方式确定 \(\sum b\) 的最小可能取值,可通过 \(a_i+b_i \le a_{i+1}+b_{i+1}\) 列出不等式求解。然后我们将贡献差分并提前计算,即可省下一维状态。
#9156. 支配 (dominator)
建出支配树,发现如果一个点的受支配集改变,其子树中结点的受支配集也会改变。因此我们只需找深度尽量小的结点。考虑一个结点什么时候不合法,那么一定是多了一条绕过其在支配树上父亲的路径。考虑一个结点 \(u\),则存在路径 \(1\to x\to y\to u\) 不经过 \(fa_u\)。前半在 \(x\) 的祖先链上打标记,后半在枚举 \(u\) 在反图上求出不经过 \(u\) 能到达哪些点。
#9158. 取模 (mod)
枚举 \(a_k\),把取模后序列记为 \(\{b\}\),则对于 \(b_i+b_j\gt a_k\) 的,我们必然选择最大两个数;否则和都在 \(a_k\) 以内,双指针。复杂度 \(O(n^2\log n)\)。加入剪枝:从大到小枚举当 \(a_k\),当 \(ans\ge a_k\) 是跳出。然后复杂度就对了。很厉害。