传送门:Educational Codeforces Round 150 (Rated for Div. 2)
A. Game with Board
题意:
给定初始序列为 $n$ 个 $1$ ,两人轮流行动,每次可以选择序列中若干个相同的数,剔除,并将他们的和加入序列。第一位无法行动的一方获胜。假设二人都绝对聪明,试问先手是否必胜。
题解:
分类讨论一下:
- $2\leq n \leq 4$,有限轮模拟易得后手必胜。
- $n\geq5$ ,则先手取 $n-2$ 个 $1$, 后手只能取 $2$ 个 $1$ , 之后序列变为 $\{n-2, 2\}$ ,故先手必胜。
code:
1 | void solve() { |
C. Ranom Numbers
题意:
A, B, C, D, E 分别代表 $1, 10, 100, 1000, 10000$ 。给定一由大写字母 ABCDE 组成的串,对于某一字符,若字符串后方有严格大于它的字符,则符号为负,否则为正。字符串权值为所有字母乘上符号的权值之和。
现可以修改至多一字符,求可能的最大权值。
题解:
据说 DP 和贪心均可,这里思路是 DP 。
为了方便起见,先将字符串反转,规则也对应修正。
然后设计状态: $F[i][j][0/1]$ 代表到第 $i$ 位,目前前缀最大值为 $j$ ,且已经/未修改的最大权值。 $i$ 这一位用滚动数组滚掉,然后枚举状态的转移即可。
复杂度 $O(nMK)$ ,其中 $M=5, K=2$ 。
1 | void solve() { |
D. Pairs of Segments
题意:
给定 $n$ 条线段,用区间表示 $[l,r]$ 。若 $n$ 为偶数,且可以将 $n$ 条线段分为 $\frac{n}{2}$ 对, 每一对线段相交, 不成一对的线段相交,则称其 beautiful 。现问至少删去多少线段,使得剩下的线段可以 beautiful 。
题解:
$n$ 比较小。一开始以为是 $dp$ 但怎么都消除不了后效性。实际解法是——直接暴力。
首先考虑两对线段,共四条。不成对线段不相交的等价条件可以表示为: 成对线段取并集,所得两条线段不相交。
因此可以直接求出 $C_n^2$ 对线段中,相交对的并集。然后找出尽量多的并线段,使其互不相交即可。互不相交可以天然保证每条线段至多用了一次。求不相交线段数目,这里用了动态开点线段树。
复杂度 $O(n^2logn)$ 。
code:
1 | const int N = 1e6 + 5; |
E. Fill the Matrix
题意:
给定一 $n*n$ 的矩阵,其中第 $i$ 列的第 $1-a_i$ 行为黑格, $a_i-n$ 行为白格,仅白格可以填数。当一个格填数 $x$ 且其正右侧格填数 $x+1$ 时,贡献一 beauty 。填入 $1-m$ 共 $m$ 个数,求最大 beauty 值。
题解:
看起来似乎比其他几道好想很多。上层所有线段都是下层线段的子集,因此从最底层线段开始枚举,填数,分裂即可。
这里还是用的线段树。注意细节。
code:
1 |
|