1 条题解
-
0
题目理解
我们有 张卡片,初始状态为:
- 前 张:I(正面)
- 接着 张:O(反面)
- 接着 张:I(正面)
- 接着 张:O(反面)
- 最后 张:I(正面)
目标:通过若干次翻转操作,使得所有卡片都变成 I(正面)。
每次操作 会翻转区间内的所有卡片(I↔O)。
花费:操作 的花费是 秒。
关键观察
1. 问题转化
设总长度 。
定义数组 ,初始时:
- 表示位置 是 I(正面)
- 表示位置 是 O(反面)
那么初始时:
- :
- :
- :
- :
- :
目标:让所有 。
操作 相当于对区间内的所有值进行异或 。
2. 差分思想
定义差分数组 :
- for
- (边界)
那么:
- 初始时 中 的位置对应着 中值变化的位置
- 目标:所有
一次操作 会翻转 ,这等价于:
花费:
3. 问题重述
现在问题变成:
- 我们有 数组,其中某些位置是 ,其他是
- 每次操作选择两个位置 ,花费 将 和 翻转
- 目标:用最小总花费让所有
注意:由于每次翻转两个位置, 的个数必须是偶数才有解。
4. 图论建模
把每个 的位置看作图中的一个节点。
操作 可以看作连接节点 和 的一条边,边权为 。
问题转化为:将节点两两配对,使得配对边的总权值最小。
1. 确定 的位置
初始 中 的位置是:
- (从 I→O)
- (从 O→I)
- (从 I→O)
- (从 O→I)
所以有 个位置:。
2. 配对问题
我们需要将这 个位置分成 对,每对 的花费是它们之间通过操作可达的最小代价。
对于一对位置 ,最小花费就是它们之间的最短路径长度(边权为操作花费)。
3. 最短路计算
以所有位置为节点,每个操作 对应一条边:
- 从 到 ,边权
- 从 到 ,边权 (无向图)
我们需要计算 之间的两两最短路。
4. 动态规划配对
用 DP 状态 表示已经配对的节点集合,计算最小总花费。
优化
实际上,由于只有 个关键点,我们可以:
- 只计算这 个点之间的最短路
- 使用 Floyd-Warshall 算法计算所有点对最短路
- 然后枚举所有配对方案
总结
这道题的关键在于:
- 差分转化:将区间翻转转化为端点翻转
- 图论建模:将操作视为图中的边
- 最短路计算:计算关键点之间的最短距离
- 配对优化:将问题转化为最小权完美匹配
通过巧妙的建模,我们将一个看似复杂的区间操作问题转化为了经典的最短路和匹配问题。
- 1
信息
- ID
- 5212
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者