Codeforces 1372D Omkar and Circle
重新表述
环上有 \(n\) 个非负整数,\(n\) 是大于 1 的奇数。
每相邻两数之间插一块挡板,最初有 \(n\) 块挡板。
相邻两挡板之间称为一段。最初有 \(n\) 段。
每个数可以被染成白色或黑色,最初每个数都是白色的。
将题目描述的操作重新表述为:任选一段,将其中的数全染成黑色并将其两端的两块挡板抽走。
不断如此操作直到只剩一块挡板。此时 \(n\) 个数成为一段,所有白色的数之和即是题目中所说的环上的最后一个数。
不变量
不难证明,每次操作过后,每一段内
- 总有奇数个数。
- 两端的数总是白色的。
- 相邻两白色的数之间总是隔着奇数个黑色的数。
可以证明,只有一块挡板且满足条件2和条件3的局面都是可以达成的最终局面。
转化
至此,原问题转化成:
任选环上紧挨着的两个数,在这两数之间把环剪开,得到一个数组。求数组的奇数位置上的数之和的最大值。
官方题解给出了一个简短的做法:
用输入的数组 \(a_1, \dots, a_n\) 构造一个新数组
\(a_2, a_4, \dots, a_{n-1}, a_1, a_3, \dots, a_n, a_2, a_4, \dots, a_{n-1}\)
答案即此数组的长为 \(\frac{n + 1}{2}\) 的子段的和的最大值。