ARC 107 F Sum of Abs 题解
先来一波提示:
- 若联通块内 b i b_i bi的和为正数,最终的得分直接就是 ∑ b i \sum b_i ∑bi,若和为负数,则最终分数为 ∑ ( b i × − 1 ) \sum (b_i\times -1) ∑(bi×−1),也就是说每一个点要么直接将 b i b_i bi算入答案,要么将 b i × − 1 b_i\times -1 bi×−1算入答案,要么直接删去,且一个联通块内算入答案的方式相同(要么都不 × − 1 \times -1 ×−1,要么都 × − 1 \times -1 ×−1)。
- 考虑每一个点算入答案的方式与 ∣ b i ∣ |b_i| ∣bi∣之间的差。也就是这种方式的代价。
- 每一个点要么删掉,要么乘上-1,要么直接算入答案。匹配!
- 网络流!尝试构图。
- 最小割!
请读者先思考以上5个问题在看下面的题解。
…
…
…
…
…
…
题解:
首先我们将每一个点的 b i b_i bi的绝对值算入答案。
- 若 b i < 0 b_i<0 bi<0则乘上-1,删除,乘1的代价分别为,0, a i + ∣ b i ∣ a_i+|b_i| ai+∣bi∣, 2 × ∣ b i ∣ 2\times |b_i| 2×∣bi∣
- 若 b i ≥ 0 b_i\geq0 bi≥0则乘上-1,删除,乘1的代价分别为, 2 × ∣ b i ∣ 2\times |b_i| 2×∣bi∣, a i + ∣ b i ∣ a_i+|b_i| ai+∣bi∣ , 0 0 0
构建一张图:
- 首先是原点和汇点, S S S和 T T T。
- 然后将每一个点拆成“入”和“出”,(网络流经典套路)
- 然后将原图中的边在这张图上连起来
- S → i S\rightarrow i S→i,代表i号点以 b i × − 1 b_i\times -1 bi×−1算入答案, i → T i\rightarrow T i→T表示i以 b i × 1 b_i\times 1 bi×1算入答案。
- 可以发现要使最终的每一个联通快算入答案的方式都一样,最终的 S S S到 T T T不连通。
- 也就是需要割一些边,使得最终的图不连通。
- 若割 S → i S\rightarrow i S→i表示 i i i以 b i × 1 b_i\times 1 bi×1算入答案。否则 i → T i\rightarrow T i→T, i i i以 b i × − 1 b_i\times -1 bi×−1算入答案。
最终答案为 ∑ ∣ b i ∣ − m i n c u t \sum |b_i|-\mathbf{min cut} ∑∣bi∣−mincut。
代码非常简单,只要理解上述题解就可以在5min打出来,所以这里就不展示了。