1 条题解
-
0
题目理解
我们有一个长度为 的数组 ,可以进行任意次操作:
选择 ,交换 与 (即关于中心对称的位置交换)。目标:最小化扰动
也就是相邻相等元素的对数。
核心观察
- 操作允许我们将对称位置的元素任意排列,因为交换两次等于没动,且可以对多对不同位置独立操作(但要注意, 和 独立于其他 位置)。
- 事实上,考虑第 对位置 (当 时),它们影响的是四个相邻关系:
- 与
- 与
- 与
- 与
由于 和 的内部交换只影响这些局部位置,我们可以独立地处理每一对对称位置,尝试减少扰动。
局部最优决策
对每一对 ,在它们左边的元素是 ,右边的元素是 (当 时,保证不重叠?
注意:如果数组长度为奇数,中间元素 时不能交换,但交换也不影响,因为是自己换自己。
所以只考虑 。简化问题
我们只关心这四个元素: 左邻居 ,当前对中的一个 ,另一个 ,右邻居 (这里对称位置的右邻居)。
实际上正确考虑边界: 我们有两种可能的排列:
- 保持原顺序
- 交换后顺序为
考虑它们对扰动的贡献变化:
- 原来可能已经存在 或
- 交换后变为 或
- 对右半部分也有类似对称的四个关系。
实际上,我们可以只考虑前一对相邻关系 与当前第一个元素 以及 当前第二个元素与 (右邻居),因为其它相邻关系在另一边的决策中已覆盖或对称。
但标程给出的简化思路是:
四种情况判断
-
情况1: 且
- 无论交换与否,这两对等值关系至少保留一个,交换可能减少某个,但总体不会变少吗?需要验证。
-
情况2: 但
- 不交换时,左边有一对相同。交换后,左边 与 比较。
如果 ,左边仍然相同,否则左边少一个相同对。右边原来不同,交换后右边 与 比较, 可能等于 吗?不保证。
所以不一定改善,但实际标程结论是:如果 或 ,则交换至少不会更差。
- 不交换时,左边有一对相同。交换后,左边 与 比较。
-
情况3: 且
- 对称情况,交换至少不会更差。
-
情况4: 两边都不相等
- 交换可能使某一边相等,但也可能使另一边相等,需要具体看值。
但标程结论是:如果左边当前不等、右边当前不等,交换可能产生新相等,也可能消除,但我们可以通过尝试选最优。
- 交换可能使某一边相等,但也可能使另一边相等,需要具体看值。
最终数学结论:
- 如果 或 (注意这里的右邻居标号是 ,但原文写的是 ,即右边相邻相等),那么交换 和 后,总扰动不会增加。
- 所以最优策略是:对每个 从 到 (对应位置 和 ),如果当前 或 ,就交换 与 。
这样,我们贪心地消除所有可以通过对称交换消除的相邻相等对。
算法步骤
- 读入 和数组 (1-indexed)。
- 对 到 :
- 如果 或 ,则交换 与 。
- 计算最终数组的扰动:。
- 输出 。
复杂度分析
- 每个测试用例 。
- 总 不超过 ,可过。
示例验证
以第一个样例为例:
初始:
: 相等,交换 与 →
已超过 ,停止。
扰动:相邻 否, 否, 是, 否 → 1 对。符合输出。
- 1
信息
- ID
- 6671
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者