正睿 2018 提高组十连测 Day2 T2 B
题目链接
http://www.zhengruioi.com/contest/84/problem/318
题解写的比较清楚,直接扒过来了。
B
算法 1
直接按题意枚举,动态规划或是记忆化搜索。
时间复杂度 \(O(a^n)\)。期望得分 \(30\) 分。
算法 2
考虑第二个测试点。只需要记录当前还有多少个位置为 \(1\) 就行了。
时间复杂度 \(O(n)\)。期望得分 \(10\) 分。加上算法 1,期望得分 \(40\) 分。
算法 3
答案可以看成是每一个元素被选中的次数之和。由于期望的线性性,我们可以去计算每一个位置被选中的次数的期望。
首先,第一个元素一定被减了 \(a_1\) 次。
考虑某一个位置 \(i\),假设当前有 \(c\) 个元素不为 \(0\),那么每个元素被操作的概率都是 \(\frac{1}{c}\)。倘若只关注 \(1\) 和 \(i\) 两个元素,可以发现操作其它元素的时候对它们没有影响,而且它们两个被操作的概率是相等的。于是这个问题就等价与一个只有两个元素的原问题。
因此元素之间是独立的!使用算法 1 中的动态规划就可以知道每个元素对答案的贡献,求和即可。
时间复杂度 \(O(a^2+n)\)。期望得分 \(60\) 分。
算法 4
算法 3 中的动态规划可以看成从 \((a_1, a_i)\) 出发的随机游走,每次随机一个方向将减 \(1\),直到走到坐标轴上为止。若停在 \((0,a)\),对答案的贡献为 \(a_i-a\)。若停在 \((a,0)\),对答案的贡献为 \(a_i\)。
于是可以直接写出贡献的式子。(这里\(a_i-1+i\)的原因是最后一步只能是\(a_1-1\))
前面那项是停留在 \((0,a)\) 的答案,后面那项是停留在 \((a,0)\) 的答案。
当 \(a_i\) 增加 \(1\) 的时候,变化的贡献可以在 \(O(1)\) 的时间内得到。(前后都是只增加了一项)
时间复杂度 \(O(a+n)\)。期望得分 \(100\) 分。