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 $ 若要合法,需满足以下几个条件:

  1. $ \forall i \in [1, m], 0 \leq s[i] - s[i - 1] \leq 1 $
  2. $ \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\)),每个元素的生成公式为

\[b_{i, j} = a_{i, j} + a_{i, j + 1} + a_{i + 1, j} + a_{i + 1, j + 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}\)

输出格式

对于每组数据:

  1. 若矩阵 \(b_{i, j}\) 无法被生成,则输出一行一个字符串 NO
  2. 若矩阵 \(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 $的解。

posted @ 2024-10-15 21:33  zeta炀  阅读(28)  评论(0)    收藏  举报