Codeforces Round 889 (Div. 2)
Codeforces Round 889 (Div. 2)
A. Dalton the Teacher
找出\(p_i = i\)的位置的数量\(t\),答案即为数量$\lceil \frac{t}{2} \rceil $
B. Longest Divisors Interval
若\(n\)能被\(l, l+1,l+2, ..., l+k\)整除,则n一定能被\(1, 2, ..., k + 1\) 整除,证明如下:
首先1显然,\(l, l + 1\)中一定有2的倍数,\(l, l + 1, l + 2\) 中一定有3的倍数,以此类推。
从2开始枚举因数直到不能整除,即为答案。
C1 & C2. Dual
首先考虑同号的情况,若每个数全为正数,要使序列递增,只需按顺序从2开始对于每个i,将i-1加到i上,这样操作最多需要19次。负数的情况倒序。
考虑如何用12次将所有数变为同号,容易想到的是让绝对值最大的一个数去加到所有与它异号的数上,但是这有可能超过12次,因此统计一下正负数的个数,如果两种数都小于等于12,则可以这样操作,否则,假设负数的个数小于等于7个,这时挑选一个正数,五次对其自身操作将其变为大于20的数,然后加到每个负数上,这样最多也不会超过12次,正数小于等于7个时同理。
D. Earn or Unlock
首先,如果恰好走到了k位置,则1到k之间的数中有k-1会被用来解锁,剩下的可以获得,答案为\(ans_k = sum_k - k + 1\)。
因此只需要确定哪些位置可以恰好到达,求出\(ans_k\)的最大值即为答案。
考虑dp,设状态\(f(j)\)表示是否可以到达j的位置,转移方程为:
\(f(j) = f(j) \ or \ f(j - a_i) \quad (j >= i)\)
使用bitset优化转移:
\(dp = dp \ | \ (((dp >> i) \ | \ ((dp >> i) << a[i])) << i)\)
E. Expected Destruction
将集合看成n个物体在数轴上向右移动,相碰会消失一个。
如果任何两个物体都不相碰,则需要\(\sum (m + 1 - s_i)\)秒,若有两个物体在x的位置相撞,会使答案减小\(m + 1 - x\)。
我们将碰撞视为只发生在最初相邻两个物体上,这是因为,假设两个物体为i和i + 1,若物体i - 1向前走碰到了i,我肯可以将其视为i - 1消失了,如果i + 1向后移动碰到了i + 2,可以视为i + 2消失了。
因此只需要对于每对最初相邻的物体算出他们在任一位置x相遇的概率\(p\),再将最初的答案减去\(p \cdot (m + 1 - x)\)即可。
概率使用dp计算,对于两个物体x,y,\(s_x < s_y\),设\(f(i)(j)\)表示x走到i,y走到j的概率,转移方程为:
\(f(i + 1)(j) = f(i + 1)(j) + \frac{1}{2} \cdot f(i)(j) \qquad (if \quad i + 1 \leq j)\)
\(f(i)(j + 1) = f(i)(j + 1) + \frac{1}{2} \cdot f(i)(j) \qquad (if \quad j + 1 \leq m)\)
复杂度为\(O(nm^2)\)