Codeforces Round #585 (Div. 2)
Contest Info
[Practice Link](https://codeforc.es/contest/1215)
Solved | A | B | C | D | E | F |
---|---|---|---|---|---|---|
5/6 | O | O | O | O | Ø | - |
- O 在比赛中通过
- Ø 赛后通过
- ! 尝试了但是失败了
- - 没有尝试
Solutions
A. Yellow Cards
瞎分类讨论一下。
B. The Number of Products
题意:
询问一个序列\(a_i\)中有多少区间的乘积为负数,有多少区间的乘积的正数。
思路:
显然乘积的正负只与区间的负数个数有关,处理负数个数的前缀和进行统计即可。
C. Swap Letters
题意:
有两个字符串\(S\)和\(T\),里面只有字符'a'和'b',现在每次可以选择一个\(S\)中一个位置\(pos_x\)和\(T\)中一个位置\(pos_t\),交换这两个字符,问最少多少次操作可以使得两个字符串相同。
思路:
- 显然,相同的位不会进行交换
- 那么考虑剩下的只有\(ab\)和\(ba\)。
- 那么考虑两对\(ab\)可以通过一次交换,变成\(aa\)和\(bb\)
- 同理\(ba\)也如此
- 那么当\(ab\)和\(ba\)的总个数是奇数,那么无解
- 如果总个数是偶数,但是两种的种类都是奇数,可以通过一次交换,将一种变成另一种
D. Ticket Game
题意:
给出\(n\)个数,\(n\)是偶数,有些位置的数字消失了,消失的数字个数也是偶数。
现在两个人,轮流给消失的位置填数\(x \in [0, 9]\),先手的人不想让前\(n / 2\)个数的和等于后\(n / 2\)个数的和,后手的人想让它们相等
问两个操作最优的情况下,谁会胜利
思路:
如果前\(n / 2\)个数中和后\(n / 2\)个数中都有消失的数,那么大力猜测肯定是一方填一个,另一方在对面填相同的一个,消耗掉这次次数。
那么问题归结为只有一边可以填数的问题。
那么考虑还剩下\(x\)次机会,显然两边的数的差距要是\(x * 9 / 2\)才可以后手胜利,不然先手总是可以全填\(0\)或者全填\(9\)来获得游戏胜利。
差距为\(x * 9 / 2\)的话,后手就跟先手填的数组成\(9\)即可。
E. Marbles
题意:
有\(n\)个石头,每个石头有一种颜色\(a_i(1 \leq a_i \leq 20)\),现在可以任意交换两个相邻的石头,问最少的交换次数使得同一种颜色所在的地方下标是一段连续的下标。
思路:
令\(cnt[i, j]\)表示将所有颜色为\(i\)的石头移动到所有颜色为\(j\)的石头后面的代价,不考虑其他石头。
再令\(f[S]\)表示哪些石头已经固定了,即他们已经连续了,\(S\)表示的是一个二进制状态,然后枚举一个新的颜色\(i\),表示将这个颜色\(i\)的石头移动到这些石头的后面的最小代价。
那么转移就是\(f[S | (1 << i)] = min(f[S | (1 << i)], f[S] + \sum\limits_{j, j \in S} cnt[i, j])\),有点神奇。。