AT_agc036_d [AGC036D] Negative Cycle
首先把该问题转化到最短路上考虑,这是很自然的,因为负环判定就要跑这个。
发现所有 \(dis_i \le 0\),由于边权为 \([-1, 1]\),根据连续性,应该能取到每一个值,同理,\(dis_{i + 1} \le dis_{i}\),因为可以直接从 \(i\) 转移到 \(i + 1\)。
那么现在按照值从大往小在序列上从左往右划分成若干个连续段,每个连续段的 \(d\) 都应该一样,当然,这是在没有负环的情况下的。
我们看看何时添加 \(-1\) 的边会使得该结构出现负环,当且仅当在一个连续段内出现 \(-1\) 的边,在不同连续段之间无论出现多少条边都是可以的,因为你考察后面得结构不会通过 \(-1\) 的边转移到前面去,所以后面仍然更小,这些差距只会拉的越来越大,这是本题的妙处之一。
那么我们此时可以将问题变为不含 \(-1\) 的边,只考察 \(1\) 的边,怎么划分连续段,此时不能按照值来划分,按照松弛区间划分,这样加入 \(-1\) 的边的时候能保证合法,最后写个 DP 加二维前缀和就做完了。

浙公网安备 33010602011771号