20241015最短路及生成树
$ \color{#66ccff} A(删去). $ $ \color{#66ccff} The $ $ \color{#66ccff} army $ $ \color{#66ccff} of $ $ \color{#66ccff} Thutmose $ $ \color{#66ccff} III $
题目描述
给你 $ n $ 个区间,你需要在数轴上选一些点,使得每个区间内至少有一个点。同时你需要最小化单个区间内点数的最大值,输出任意一种可行的方案所选取的点数并输出取哪些点。
$ n \leq 2500 $ , $ -10^{18} \leq l_i < r_i \leq 10^{18}$
思路
看数据范围发现 $ l_i $ 和 $ r_i $ 的范围都极大,且显然放置的点在区间端点上不会更劣,所以对 $ l_i, r_i $ 离散化,离散化后的最大值为 $ m $ 。
题面中看到"最大值最小",起手先打一个二分答案。
假设当前单个区间内点数的最大值为 $ mid $,考虑如何check。
设 $ s_i $ 表示坐标 $ i $ 及以前的点的个数。
不难发现 $ mid $ 若要合法,需满足以下几个条件:
- $ \forall i \in [1, m], 0 \leq s[i] - s[i - 1] \leq 1 $
- $ \forall i \in [1, n], 1 \leq s[r[i]] - s[l[i] - 1] \leq mid $
这显然可以用差分约束判断有无解并求出一组 $ s_i $ 的解。
对 $ s_i $ 做差分即可得出每个坐标上是否放点。
Over.
$ \color{#9d3dcf} A. [省选联考 2021 A 卷] 矩阵游戏$
题目描述
Alice 有一个 \(n \times m\) 的矩阵 \(a_{i, j}\)(\(1 \le i \le n\),\(1 \le j \le m\)),其每个元素为大小不超过 \({10}^6\) 的非负整数。
Bob 根据该矩阵生成了一个 \((n - 1) \times (m - 1)\) 的矩阵 \(b_{i, j}\)(\(1 \le i \le n - 1\),\(1 \le j \le m - 1\)),每个元素的生成公式为
现在 Alice 忘记了矩阵 \(a_{i, j}\),请你根据 Bob 给出的矩阵 \(b_{i, j}\) 还原出 \(a_{i, j}\)。
输入格式
本题有多组数据。
第一行,一个整数 \(T\),表示数据组数。对于每组数据:
第一行,两个正整数 \(n, m\),表示矩阵 \(a_{i, j}\) 的大小。
接下来 \(n - 1\) 行,每行 \(m - 1\) 个非负整数,表示 \(b_{i, j}\)。
输出格式
对于每组数据:
- 若矩阵 \(b_{i, j}\) 无法被生成,则输出一行一个字符串
NO
。 - 若矩阵 \(b_{i, j}\) 可被生成,则先输出一行一个字符串
YES
,接下来输出 \(n\) 行每行 \(m\) 个(用单个空格分隔的)大小不超过 \({10}^6\) 的非负整数表示 \(a_{i, j}\)。
若有多个矩阵 \(a_{i, j}\) 可生成给出的 \(b_{i, j}\),输出其中任意一个即可。
【数据范围】
对于所有测试数据:\(1 \le T \le 10\),\(2 \le n, m \le 300\),\(0 \le b_{i, j} \le 4 \times {10}^6\)。
每个测试点的具体限制见下表:
测试点编号 | \(n, m \le\) | 特殊限制 |
---|---|---|
\(1 \sim 4\) | \(3\) | 无 |
\(5 \sim 7\) | \(10\) | \(m = 2\) |
\(8 \sim 10\) | \(100\) | \(m = 2\) |
\(11 \sim 15\) | \(300\) | \(0 \le b_{i, j} \le 1\) |
\(16 \sim 20\) | \(300\) | 无 |
思路
这道题最恶心人的是 $ 0 \le a_{i, j} \le 10^6 $ 这一限制条件。
我们可以先把这一限制丢掉,考虑如何在没有这个限制的情况下构造出一组合法的解。
很显然的一种构造方法是将 $ a_{1, i}, a_{i, 1} $ 均设为 $ 0 $,其余 $ a_{i, j} = b_{i - 1, j - 1} - a_{i - 1, j - 1} - a_{i - 1, j} - a_{i, j - 1} $。
设该特殊解为 $ A_{n, m} $。
然后呢?如何把 $ A_{i, j} $ 转化为 $ 1 \le a_{i, j} \le 10^6 $ 的 $ a_{i, j} $ ?
可以发现对于数组 $ A $ 中的每一行依次进行 $ +r_i $, $ -r_i $ $ +r_i $, $ -r_i $ $ ······ $ 的操作能够使其任然合法。
同理可对每一列交替进行 $ +c_i $, $ -c_i $ $ +c_i $, $ -c_i $ $ ······ $
故我们可以将 $ a $ 表示为:
$ A_{1, 1} + r_1 + c_1 $, $ A_{1, 2} - r_1 + c_2 $, $ ······ $
$ A_{2, 1} + r_2 - c_1 $, $ A_{2, 2} - r_2 - c_2 $, $ ······ $
$ A_{3, 1} + r_3 + c_1 $, $ A_{3, 2} - r_3 + c_2 $, $ ······ $
$ ······· $
其中 $0 \le a_{i, j} \le 10 ^6 $。
到这里其实形式已经很接近差分约束了,但和标准的差分约束任有一定的区别。
那如何能使其向标准的差分约束去靠近呢?
考虑改变一下 $ r_i $ 和 $ c_i $:
设 $r_i' = \begin{cases} r_i, i \equiv 1 ( \mod 2 ) \ -r_i, i \equiv 0 ( \mod 2 ) \end{cases} $
$c_i' = \begin{cases} -c_i, i \equiv 1 ( \mod 2 ) \ c_i, i \equiv 0 ( \mod 2 ) \end{cases} $
则 $ a $ 可以表示为:
$ A_{1, 1} + r_1' - c_1' $, $ A_{1, 2} - r_1' + c_2' $, $ ······ $
$ A_{2, 1} - r_2' + c_1' $, $ A_{2, 2} + r_2' - c_2' $, $ ······ $
$ A_{3, 1} + r_3' - c_1' $, $ A_{3, 2} - r_3' + c_2' $, $ ······ $
$ ······· $
此时就是差分约束的板子题了。
我们可以用差分约束求出一组合法的 $ r_i' $ 和 $ c_i' $,继而得到一组合法的 $ a $的解。