CSP模拟赛 #38
瓜粉肠。
A
题意:一张 \(n\times m\) 的网格,每个格子中有一个数 \(a_{i, j}\)。你在每个格子 \((i, j)\) 都放置了一个 L 型管道,使得其可以到达 \((i + 1, j), \ (i - 1, j)\) 中恰好一个格子,以及到达 \((i, j + 1), \ (i, j - 1)\) 中恰好一个格子。当相邻两个格子 \((x_1,y_1),(x_2,y_2)\) 互相可达时,会产生 \(w(a_{x_1,y_1} \oplus a_{x_2, y_2})\) 的收益,其中 \(w(x) = x + \text{popcount} ( x)\),求最大总收益。
\(1\le n, m\le 1000\)
仔细观察可以发现,行和列是独立的。
考虑行,每一行也都是独立的。对于一行,我们可以配对相邻两个格子,简单 dp 即可。
B
给定 \(n, q\),一开始 \(a_1, a_2, \dots, a_n\) 都是 \(0\)。有 \(q\) 次操作,每次给定 \(b_i\),表示令 \(a_{1\dots n}\) 全局加 \(b_i\),并对所有 \(a_j \gets \max(0, \min(j, a_j))\)。求每次操作完的 \(\sum\limits_{j = 1} ^ n a_j\)。
\(1\le n\le 10^9, \ 1\le q\le 10^6\)
任何时刻下的 \(a\) 一定是形如平滑的线段和斜率为 \(1\) 的线段交替出现。我们考虑维护所有斜率为 \(1\) 的线段的区间,每次最多删掉最前面的若干个区间,并加入至多一个区间,时间复杂度 \(\mathcal O(q)\)。
C
有 \(n\) 个格子,上帝给其中 \(m\) 段区间内的格子染黑了(可重复染色)。你需要再染至多 \(k\) 次,每次选择一段长度为 \(x\) 区间染黑。求最终最长全黑区间长度。
\(1\le m\le 10^5, \ 1\le k,x\le n\le 10^9\)
当 \(n\le 10^5\) 是容易的,可以倍增:设 \(d_{i, j}\) 表示从第 \(i\) 个格子开始,至多染 \(2^j\) 次最远可以到达哪个格子。
先把所有区间处理一下,满足区间两两之间至少有一个白格子。
定义关键区间:对答案有实质性贡献。
定义全关键区间:该区间中的格子后续没有被染过色。
对于一种方案,提取出所有关键区间,且至少有一个全关键区间。我们发现,全关键区间一定可以调整为关键区间中的任意一个。因此,我们可以枚举第一个关键区间视为全关键区间。
设 \(d_{i, j},\ s_{i, j}\) 表示第 \(i\) 个区间作为关键区间,每次跳向下一个关键区间,跳 \(2^j\) 次跳到的区间编号,以及花费的染色次数。
考虑如何计算一个区间 \([l_i, r_i]\) 的下一个关键区间 \([l_j, r_j]\),应满足 \(r_i + 1\) 加上若干个 \(x\) 后可以到达区间 \([l_j, r_j]\) 中的位置,即
可以在余数上建立动态开点线段树,标记永久化。
- 启示:提取关键位置;信息转化为统一形式(一定不优),避免讨论
D
题意:一个 \(n\) 维空间,每一维大小为 \(p_{1\dots n}\)。你每次可以从一个位置开始走,每次从 \((x_1, x_2, \dots, x_n)\) 走向 \((y_1, y_2, \dots, y_n)\),必须满足 \(x_1\le y_1, \ x_2\le y_2,\dots, \ x_n\le y_n\) 且 \(\sum\limits_{i = 1} ^ n (y_i - x_i) = 1\),然后在任意一个位置结束行走。求最少需要行走的次数,答案对 \(10^9 + 7\) 取模。
\(1\le n\le 32, \ 1\le p_i\le 10^9\)
首先 DAG 图最小链覆盖转化为求最大反链。
这里令每一维取值为 \([0, p_i - 1]\)。弱化问题,当 \(p_1 = p_2 = ... = p_n = 2\) 时,令 \(m\gets \lfloor\dfrac n2 \rfloor\),那么取出所有具有 \(m\) 个 \(1\) 的格子,他们构成一组最大反链。
类比上面的情况,令 \(m\gets \lfloor \dfrac {\sum_{i = 1} ^ n p_i} 2\rfloor\),我们取出所有维度的数字加起来总和为 \(m\) 的格子,构成一组反链,我们猜测其为最大反链。
这样可以直接 DP,过前六个 Subtask。
考虑容斥,钦定 \(S\) 集合内的维度分配的数字 \(\ge p_i\),方案数为 \(\sum\limits_S [\sum\limits_{i \in S} p_i\le m] (-1)^{|S|} \dbinom {m - \sum\limits_{i \in S} p_i + n - 1}{n - 1}\)。
\(n\le 32\) 可以考虑 meet in middle。分别枚举左右两边的钦定情况,算出对应的 \(p_i\) 总和,然后 \(\sum\limits_{i \in S} p_i \le m\) 的条件可以双指针处理。
固定左边总和为 \(a\),右边总和为 \(b\),\(\dbinom {m - a - b + n - 1}{n - 1}\) 是一个关于 \(a, b\) 的不超过 \(n - 1\) 次的二元多项式,可以处理其系数 \([a^i b^j]F(a, b)\)。
现在枚举左边一个固定的钦定情况,其总和为 \(a\),已经考虑的右边钦定情况,分别算出 \(\sum b^0, \sum b^1, \sum b^2, \sum b^3 , \dots\) 即可。最后再考虑一下容斥系数,正负分开计算即可。
- 启示:组合数转多项式;Dilworth 定理;猜结论