CF Round 1004 记录 & 题解(div.1 A - D1 & div.2 D - F)

今天上午VP Codeforces Round 1004 (Div. 2),下午改Codeforces Round 1004 (Div. 1)。上午C题因为少判了一个条件,罚时吃饱了。

  • [Codeforces 2066A & 2067D] Object Identification

    神奇交互题。观察到一个性质:对象 A A A 的答案可能是 0 0 0,但对象 B B B 的答案不可能是 0 0 0

    x 1 , x 2 , … , x n x_1, x_2, \dots, x_n x1,x2,,xn 不是 1 ∼ n 1 \sim n 1n 的一个排列,一定可以找到一个不在 x x x 中的数 k k k,对其与另一个不同的数询问。若是对象 A A A,因为 k k k 没有向任何点连边,所以答案一定为 0 0 0。若答案不为 0 0 0,则是对象 B B B

    x 1 , x 2 , … , x n x_1, x_2, \dots, x_n x1,x2,,xn 1 ∼ n 1 \sim n 1n 的一个排列,那么找到满足 x i = 1 , x j = n x_i = 1, x_j = n xi=1,xj=n i , j i, j i,j。询问 ( i , j ) (i, j) (i,j) ( j , i ) (j, i) (j,i)。若是对象 B B B,那么两个答案应该是相等的,并且都 ≥ n − 1 \ge n - 1 n1(因为 ∣ x i − x j ∣ = n − 1 \left | x_i - x_j \right | = n - 1 xixj=n1)。然而如果是对象 A A A,那么当 n ≥ 3 n \ge 3 n3,不可能同时存在一条长度至少为 n − 1 n - 1 n1 i i i j j j 的路径与一条长度至少为 n − 1 n - 1 n1 j j j i i i 的路径(因为 2 ( n − 1 ) ≥ n 2(n - 1) \ge n 2(n1)n)。综上所述,若两个答案相等并且都 ≥ n − 1 \ge n - 1 n1,则是对象 B B B,否则是对象 A A A

    按照题解模拟即可。

  • [Codeforces 2066B & 2067E] White Magic

    这题似乎挺简单的,只是赛时看了一眼但是没多想。

    首先可以注意到,没有 0 0 0 的子序列一定是合法的,有两个及以上的 0 0 0 的子序列一定是非法的。所以要么选所有非零元素,要么选所有非零元素与一个 0 0 0

    若是选一个 0 0 0,显而易见,选最左侧的 0 0 0 是最优的。于是判断这么选是否合法即可。

  • [Codeforces 2066C & 2067F] Bitwise Slides

    很有意思的 DP 题。

    我们根据题意可以得出,对于时刻 i i i,记 s u m i = ⊕ j = 1 i a j sum_i = \oplus_{j = 1}^i a_j sumi=j=1iaj,有 P ⊕ Q ⊕ R = ⊕ j = 1 i a j P \oplus Q \oplus R = \oplus_{j = 1}^i a_j PQR=j=1iaj。于是对于某个时刻,有这三种状态: { s u m i , x , x } ,   { x , s u m i , x } ,   { x , x , s u m i } \{sum_i, x, x\},\ \{x, sum_i, x\},\ \{x, x, sum_i\} {sumi,x,x}, {x,sumi,x}, {x,x,sumi}。设 d p i , x dp_{i, x} dpi,x 表示这三种状态的情况数,经过推导(具体过程略),可以得出 d p i , s u m i − 1 = 3 × d p i − 1 , s u m i − 1 + 2 × d p i − 1 , s u m i dp_{i, sum_{i - 1}} = 3 \times dp_{i - 1, sum_{i - 1}} + 2 \times dp_{i - 1, sum_i} dpi,sumi1=3×dpi1,sumi1+2×dpi1,sumi。发现可以滚动。由于值域较大,用 map 维护 DP 即可。

  • [Codeforces 2066D1] Club of Young Aircraft Builders (easy version)

    有趣的组合数学题。

    因为下面的楼层并不会影响上面的楼层,所以从下往上考虑。对于某一个高度,丢飞机的次数最多为 c c c,假设它实际丢 k k k 个,则有 ( c k ) c \choose k (kc) 种情况。所以设 d p i , j dp_{i, j} dpi,j 表示到了第 i i i 层楼,已经丢了 j j j 个飞机的情况数。有转移方程 d p i , j = ∑ k = 0 c ( c k ) ⋅ d p i − 1 , j − k dp_{i, j} = \sum_{k = 0}^ c {c \choose k} \cdot dp_{i - 1, j - k} dpi,j=k=0c(kc)dpi1,jk

    答案为 d p n , m dp_{n, m} dpn,m。直接 DP 即可。

    扩展:求证答案为 ( n c − c m − c ) nc - c \choose m - c (mcncc)

你可能感兴趣的:(算法)