Ver Fonte

add post/cf754

Xi Ruoyao há 3 anos atrás
pai
commit
2af323c72a
1 ficheiros alterados com 106 adições e 0 exclusões
  1. 106 0
      content/post/cf754.md

+ 106 - 0
content/post/cf754.md

@@ -0,0 +1,106 @@
++++
+date = "2021-11-13T01:50:00+08:00"
+draft = false
+tags = []
+title = "Codeforces Round #754 (Div. 2)"
+authors = ["xry111"]
++++
+
+* [比赛链接](https://codeforces.com/contest/1605)
+
+# [A - A.M. Deviation](https://codeforces.com/contest/1605/problem/A)
+
+题意:给你三个数 $a\_1, a\_2, a\_3$,
+每次你可以给 $a\_i$ 加 $1$,$a\_j$ 减 $1$。
+要求最小化
+
+$$d(a\_1, a\_2, a\_3) = |a\_1 + a\_3 - 2 \cdot a\_2|$$
+
+显然,在题目给定的条件下,只要保证三个数和不变,可以随便改变它们的值。
+最优解显然是使得三个数尽量接近,那就取它们的平均值向上向下取一取整就行了。
+试几个数会发现如果 $\\sum a\_i$ 是 $3$ 的倍数则可以使得 $d$ 为 $0$,
+否则 $d$ 为 $1$。
+
+用 Python 3 可以写很短:
+
+```python
+t = int(input())
+for cs in range(1, t + 1):
+    a = sum(map(int, input().split()))
+    print(int(a % 3 != 0))
+```
+
+# [B - Reverse Sort](https://codeforces.com/contest/1605/problem/B)
+
+题意:给你一个串 $s \\in \\{0, 1\\}^\*$,每次操作可以从中选一个子序列,
+然后将其反序,要求用尽量少的操作将整个串排好序。
+
+这题初看上去很不可做,但是一看串只有 $0$ 和 $1$,再一看样例要么操作 $1$
+1 次要么操作 $0$ 次就感觉是假题…… 然后发现只要把 $s$ 排个序得到 $t$ 以后,
+找到所有 $s[i] \neq t[i]$ 的位置做反序就行了。
+
+这题用 Python 3 也可以写很短,但是场上把数据范围看成了 $1000 \times 1000$
+就怕卡常没敢用 Python,赛后才发现数据范围就是 $1000$。
+
+# [D - Treelabeling](https://codeforces.com/contest/1605/problem/D)
+
+由于 C 题看上去很不可做,于是先去写 D。
+
+题意:给一个树 $T = (V, E)$,你可以指定一个双射
+$f: V \\rightarrow \\{1, 2, \cdots, |V|\\}$。如果
+$(i, j) \\in E$,且 $f(i) \\oplus f(j) \\leq \\min(f(i), f(j))$,就把
+$(i, j)$ 这条边删掉,这样会得到一个森林 $G = (V, E')$。
+然后你选一个点 $v\_0$ 放一个棋子。之后你的对手先手,两人轮流移动,
+每次可以将棋子沿 $E'$ 中的一条边进行移动,不能移动到棋子曾经占据过的点,
+如果某人无法移动则输。要求你求出一个 $f$,使得能选做 $v\_0$ 的点尽量多。
+
+这题初看上去很不可做,但是 “你的对手先手” 这个条件就很有趣。
+然后在纸上画了画,感觉能够构造 $f$ 将所有边删光,
+自闭了一会以后就想到怎么构造了:首先 $T$ 作为树一定是二分图。
+那么我们对它做一个黑白染色,一定有一种颜色的点 (不妨设是黑点)
+的个数 $c$ 不超过 $\\lfloor n / 2 \\rfloor$。然后我们发现若 $a > 0$ 且
+$b > 0$,$a \\oplus b \\leq \\min(f(i), f(j))$ 的一个必要条件是
+
+$$\\text{highbit}(a) = \\text{highbit}(b)$$
+
+其中 $\\text{highbit}(x)$ 是 $x$ 中最高的,为 $1$ 的二进制位。
+于是我们把 $S = \\{1, 2, \cdots, |V|\\}$ 按照 $\\text{highbit}$
+值做一个划分:
+
+$$S\_0 = \\{ 1 \\}$$
+$$S\_1 = \\{ 2, 3 \\}$$
+$$S\_2 = \\{ 4, 5, 6, 7 \\}$$
+$$\\cdots$$
+$$S\_m = \\{ \\cdots, |V| \\}$$
+
+这样如果 $i \\neq j$ 且 $u \\in S\_i$, $v \\in S\_j$, 则
+$(u, v) \notin E'$。
+
+显然,对于 $k < m$,$|S\_k| = 2^k$,
+且
+$$\\sum\_{k < m} |S\_k| = 2^{\\lfloor \\log\_2 |V| \\rfloor} - 1
+\\geq \\lfloor n / 2 \\rfloor \geq c$$
+
+因此我们可以把黑点的个数 $c$ 表示成 $m$ 位二进制:
+
+$$c = \\sum\_{i = 0}^{m - 1} 2^i x\_i$$
+
+然后如果 $x\_i = 1$,我们就将 $S\_i$ 中的元素都分配给黑点,
+这样一定能为所有黑点都分配一个 $f(\\cdot)$ 值。
+之后将 $S$ 中尚未分配的元素都分配给白点。这样,就不存在 $(u, v, k)$ 使得
+$u$ 与 $v$ 异色,且 $u, v \\in S\_k$。这就保证了 $E' = \\emptyset$。
+此时根本没有边,对手一步都动不了,所有点都可以作为 $v\_0$。
+
+# [C - Dominant Character](https://codeforces.com/contest/1605/problem/C)
+
+题意:给定串 $s \\in \\{a, b, c\\}^\*$,要求你在 $s$ 中找一个尽量短的子串
+$t$,使得 $|t| \geq 2$,$t$ 中 $a$ 的个数大于 $b$ 的个数,也大于 $c$
+的个数。
+
+这题一开始以为是树套树二维偏序,然而做了 A、B、D
+以后就感觉这出题人只会出假题,所以这题肯定也是假题。
+然后就猜想如果 $|t| > 10$,就存在 $t'$ 是 $t$ 的子串,且 $t'$ 也满足条件,
+所以假设 $|t| \leq 10$ 然后交了一下就过了。
+
+至于为啥我暂时蒙在鼓里 …… 而且我很讨厌这种 “暴力加个 `break` 就能过”
+的假题,因为我认为这会鼓励乱冲暴力的壬。