联合省选 2021 A卷 题解

· · 个人记录

感觉最近越来越颓废了,总觉得得写些什么,但写代码是不可能的。

“那就,写点题解?”

一个简单的想法在他脑海中产生。

「题解」这个概念,他早有领略。他已经阅读过数千篇题解,自己也写过几篇。但如此正式、严肃的去写,对他来说还是第一次。面对如此压力,他感到手心有些冒汗,但他还是做好了准备,对自己说到——

“那么,接下来——”

“就是正式开始了?”

D1T1:考虑对值域双指针维护每张卡牌有多少个面可选,复杂度 O(n\log n),瓶颈在于排序。

D1T2:不难发现当第一行和第一列都确定的时候整个矩阵就确定了。所以显然可以找出一组不要求满足范围的解。然后我们发现如果对一行/一列进行 +x,-x,+x,-x,\cdots 的话,是不影响结果的。所以我们对每一行/列设立一个增加量 r_i/c_j。这样每一个点 (i,j) 可以转换为一个对 r_ic_j 的约束。但是这个约束有和也有差,怎么办呢?将奇数列 r,偶数列 c 取反,就只剩下差了。于是可以建图跑差分约束求出一组特解。

D1T3:求路径上编号最小值在端点上的点对 (u,v) 数量,考虑Floyd。考虑 f_{u,v,k} 为从 uv 只经过编号 \geq k 的点是否可行,统计 f_{u,v,u} 或者 f_{u,v,v} 即可。对于修改操作,重新定义 f_{u,v,k} 为最小可行时间,即可一遍Floyd求出答案。

D2T1:将询问拆成向上的和向下的两部分,先考虑向上的。定义 nxt_{i,p} 为从 i 向上跳的第一个 p 属性点,然后倍增。我们只记录在 c 数组里的下一个 p,可以扫一遍树得出。然后考虑向下的。不难发现这个和向上的很像,想到将序列倒过来做一遍,但是我们并不知道右边会落在哪里,这时我们考虑二分。这里就牵扯到查询 nxt_{i,p},所以我们把询问离线,然后扫一遍树得出。

D2T2:先想朴素dp,考虑当前点集 S、最后一个人 i 以及 b_i、当前花费 j。转移到人 i'、花费 b'。复杂度 O(2^nn^2m^3)。不难发现对于一个顺序 p,其最小花费是固定的,而且转移在花费上单调,所以 b' 一维可以直接设为当前最小花费而不计入转移,复杂度 O(2^nn^2m^2)。接着我们发现,最小花费 b_i+\Delta b\Delta b 仅与 ij 有关。故考虑对 \Delta b 计算贡献,发现可行,复杂度 O(2^nn^2m)

D2T3:建出支配树,如果一个点的 fa_u 发生变化,则其子树支配集均变化,否则不变化。对于查询,考虑删去 fa_u 后是否存在路径 1\rightarrow p\rightarrow q\rightarrow u。建出正图反图,暴力dfs查询即可。

怎么前言胡写的东西几乎比正文还要长,玉玉了。