1 条题解
-
0
题目重述与核心思路
我们有 个变量,初始值为 。有 个操作,第 个操作为 ,表示将 赋值为 。
操作必须全部执行一次,但顺序任意。如果无论顺序如何,最终所有变量的值都相同,则初始序列是稳定的。若第 个变量的最终值依赖于顺序,则序列是 -不稳定的。
每个查询给出 和初始 ,我们可以进行最多 次操作,每次选择一个变量减 。问:对每个 ,能否通过不超过 次减 操作,使序列变成 -不稳定。
第一步:转化为图论问题
操作 可以看作:
从 到 有一条有向边,权值为 。
变量 视为顶点 的“初始距离”。操作是松弛:
表示 。因此:
- 顶点 ,有向边 权 。
- 初始距离 。
- 按任意顺序对每条边恰好松弛一次。
这就像在图上跑单源最短路,但松弛顺序可以任意。
第二步:何时序列是 -不稳定?
设 为从 到 的最短路径长度(边数任意)。
设 为从 到 的长度不超过 1 的路径(即 0 条边或 1 条边)的最短长度:- 若 ,(0 条边)。
- 若存在 的边,则 。
- 否则 。
从 出发到 的真实最短距离为 。
初始值 相当于每个顶点 有一个初始距离 ,那么顶点 的最终可能值中,最小可能值是: [ \min_{j=1}^n (a_j + d_{j,i}) ] 因为可以先从 出发沿最短路径走到 。如果所有最短路径长度 (即路径至少包含 2 条边),那么 对任意 都不成立?
实际上,-不稳定等价于: [ \min_{j} (a_j + d_{j,i}) < \min_{j} (a_j + e_{j,i}) ] 即使用多边路径能获得严格更小的值。
因为如果最短路径长度至少为 2,那么只用 0 或 1 条边的路径无法达到这个最小值,于是可以通过先松弛进入 的边来“错过”这条最短路径,导致最终值更大。结论:
序列是 -不稳定 [ \min_j (a_j + d_{j,i}) < \min_j (a_j + e_{j,i}) ]
第三步:如何用减 操作达成 -不稳定?
我们只能减少 的值。
减少 会同时影响 和 。
目标:让前者小于后者。对固定的 ,设: [ M_1 = \min_j (a_j + d_{j,i}) ] [ M_2 = \min_j (a_j + e_{j,i}) ] 初始时可能 。我们需要减少一些 使得 。
关键观察:
要破坏平衡,我们应针对某个 ,使 减小到比所有 都小。
因为 在减小时也会变,但 可以减得更快。更精确地:
我们想让 成为新的最小值,并且它小于当前的 。
设当前 对应的顶点为 (即 ),我们需要: [ a_j + d_{j,i} < a_t + e_{t,i} ] 如果 (即 到 的最短路径长度 ),那么减少 可以让左边变小,而 不变(除非 且 也变,但 固定)。实际上,更通用的做法是:
我们考虑对每个顶点 计算:为了使 成为全局最小值,并且严格小于 ,需要减少 多少。设当前 。
我们希望: [ a_j' + d_{j,i} < m_2 ] 其中 ,。
那么: [ a_j - t + d_{j,i} < m_2 ] [ t > a_j + d_{j,i} - m_2 ] 所以最小需要的减少次数为: [ \max(0, a_j + d_{j,i} - m_2 + 1) ] (因为要严格小于,所以 )但这里假设 在 次减少后不变。实际上,如果 恰好是 的提供者, 也会变小。
所以更安全的方法是: [ \text{min_op}[i] = \min_{j: d_{j,i} < e_{j,i}} \left( (a_j + d_{j,i}) - (m_2 - 1) \right) ] 其中 。
这个值就是需要减少的总次数,当减少次数达到它时, 会比原来的 小 1,从而严格小于更新后的 (因为 最多也减少同样的量,但这里 可能不同)。
第四步:算法流程
预处理:
- 读入 ,建图 ( 为 的最小权值,无则为 )。
- 用 Floyd-Warshall 计算全源最短路 (, 可行)。
每个查询:
输入 和数组 。
对每个顶点 :- 计算
- 计算
- 若 ,则已 -不稳定,需要 次操作。
- 否则,计算: [ \text{need}i = \min{j: d_{j,i} < e_{j,i}} \left( a_j + d_{j,i} - (m_2 - 1) \right) ]
- 若 ,则 可变为不稳定。
输出长度为 的 01 串。
第五步:复杂度
- 预处理:
- 每个查询:(计算 和遍历 更新 need)
- ,,,,在 C++ 优化下可过。
第六步:对照标程
标程中:
e[i][j]是单边最短距离(0 或 1 条边)d[i][j]是任意最短距离min_dist是 (所有 的最小值)min_one_edge是 (所有 的最小值)min_op[i]初始为无穷,对每个 ,如果 ,则更新: [ \text{min_op}[i] = \min(\text{min_op}[i],\ (d[j][i] + a[j]) - (\text{min_one_edge}[i] - 1)) ] 这与我们推导的 一致。
最后输出
min_op[i] <= op。
第七步:示例验证
以第一个示例为例: ,, 时输出
0110,表示变量 2、3 可变为不稳定。
这符合题意:需要减少 1 号变量 2 次,4 号变量 25 次,使得 ,从而 对 成立。
总结
本题的核心是:
- 将操作视为图上的松弛,转化为最短路径问题。
- -不稳定等价于存在一条长度 的最短路径比所有长度 的路径更优。
- 通过减少 使 小于当前 ,所需次数可 计算。
- 利用 Floyd-Warshall 预处理全源最短路, 预处理, 回答每个查询。
- 1
信息
- ID
- 6552
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者