AT_tkppc6_2_g Must be Distinct! 题解
考虑对于相邻的两个数 \(A_i,A_{i+!}\),如果任意翻转那么 \(|A_i-A_{i+1}|\) 的取值只有 \(|A_i+A_{i+1}|\) 和 \(|A_i-A_{i+1}|\) 两种。
类似于这种 “二选一” 的决策的时候可以考虑对两个状态连边,开始的时候我们只对所有这样的两个状态之间从题目给定的 \(A\) 的初始状态指向另一种如果做了修改对应的状态,一条边的初点是我们选择的最终值。于是我们可以考虑是否要翻转以满足题目的条件。
tips: 使用离散化便可以记录状态。
做完了转化,我们看看题目里面的约束和操作在转化后的题目中等价于什么。
- 那么既然题目要求不重复,在上述的转化中就等价于每一个点至多只有 1 条出边。
- 操作一个区间等价于将区间两个端点处对应的一条边翻转(如果有一个端点在 1 或 n 则只翻转一个)。
假设我们一共翻转了 \(m\) 条边的方向,那么我们需要至少用 \(\lceil \frac{m}{2} \rceil\) 次操作来完成这些翻转。构造是简单的,我们两两配对,如果还有剩下的就和 1 或者 n 做一次就行。
现在我们就只要针对 至少翻转多少条边使得满足某个条件 这样的问题来求解了,问题简化了很多。
回到问题。显然每个独立的 弱 连通块之间是独立的,我们只针对一个 弱 连通块如何统计答案来思考。
考虑这个连通块的形态如何。设点和边的数量分别为 \(V,E\)。
- 树(\(E=V-1\))。这一部分是简单的,使用 \(DP\) 即可,我们只要考虑每个点保留哪一条出边进行决策即可。
- 基环树(\(E=V\))。此时形态是一个环上拉起来几棵树,在环上的边的方向只可能有顺时针和逆时针两种情况。对于每一棵挂着的树因为环上的点都已经有出边了所以和环上的点直接相连的边一定是入边,对于树内部使用 part1 的树的做法即可。
- 其它(\(E>V\))。任取 \(V\) 条边并定向,那么每个点一定有一条出边(基环树的性质)。此时定有 \(E-V>0\) 条边还没有加入,然而再加入显然不合法。因此这种情况无解。
把所有的连通块答案合并即可。

浙公网安备 33010602011771号