Educational Codeforces Round 157 (Rated for Div. 2) Solution
__vector__ · · 个人记录
md,D 题想到了 01trie 结果赛时脑子进水,以为会 TLE,E 题大水题结果没做。
A
Greedy.
B
本质上是把原数组按升序或降序后划分成两个长度相等的子序列,答案是两个数组分别的最大值减最小值的绝对值。
暂且按照升序来。
先把原数组排序,并且考虑划分后的第一个序列包含哪些位置。
显然必然是连续
C
预处理长度为
D
把
E
容易想到,也容易证明, 当一个人打出一个血量为
也就是说可以对于每张牌,预处理出打出它之后另一个人应该选择什么牌,用 set 维护可以轻松解决这一部分。
注:一张牌打出后,如果有多张最优的牌可以应对,那么随便选一张标记上,都一样。
然后每个牌向应对它的牌建边。
一张牌打出后,满足以下条件时打出者获胜:
- 没有可以应对的牌。
一张牌打出后,满足以下条件时打出者平局:
- 对手打出应对的牌之后会陷入平局。
- 对手打出了之前打过的牌。
一张牌打出后,满足以下条件时打出者失败:
- 对手打出了应对的牌之后必胜。
F
首先,如果单单计算满足一种条件的方案数,非常简单。
先计算满足条件 2 情况下的方案数,由此寻找突破口。
剩下计算满足条件 2 时,同时满足条件 1 的方案数,此时考虑总方案数减不合法方案数。
设
不合法方案数即
这些看上去很难计算,先把它们表示出来。
然后发现
另外
发现复杂度炸了,注意
未完待续。
G
以后或许会补。