11.26 模拟赛
复盘
T1。好难好难。先写了 \(\mathcal O(n^2)\) DP,但是没有任何前途。
尝试瞎推式子瞎猜性质。过了很久发现想得太复杂了。2h 过大样例。对拍。
T2。发现有 \(20\) 分很容易。这两个性质怎么做?
然后想性质时发现会正解了。好激动,赶紧写。
虽然细节挺多但是基本没调。T2 用了不到 1h。看起来大样例挺强就不对拍了。
T3 没任何思路。先把暴力写了看 T4。
T4 好神奇,竟然下发了 checker.cpp(虽然我不会用)。
直接模拟冒泡排序就能拿到 \(10\) 分。先写了。
发现还有 1h。想 T3 还是 T4?
算了想 T4 吧,这么有趣的题很少见。
尝试 \(n=8\)。发现可以拆成两个 \(n=4\)。\(n=4\) 的方法样例给了,用 \(4\) 步。但是怎么合并?
仿照归并排序肯定不行。
然后又是瞎试了一会,发现有个很简单的用 \(4\) 步合并的方法。这样 \(n=8\) 就能做到 \(8\) 步。能得 \(8\) 分……?太赚了太赚了。继续想别的测试点。
\(n=13\) 质数肯定不好做。\(n=16\)?这不跟上面一样,拆成两个 \(n=8\) 的,然后再用 \(8\) 步合并?
诶 \(n\) 是 \(2\) 的幂的是不是都能这样做。算一下……总共 \(26\) 分!
因为给的 checker.cpp 不会用所以我自己根据题意手写了一个。很快调完了。
还有 20min。继续做 T4 发现怎么优化这个算法都和冒泡排序一样分(\(1\) 分)。
检查了一下就交了。
\(100+100+12+26=238\)。没挂分。
总结
好的:
- 没挂分(这场不挂分真挺难的)
- T4 得到的部分分很多
不足:
- T1 花的时间有点久。尽管最后时间并没有十分紧张。
知识点
T1:数学,贪心
T2:set,线段树,贪心
题解
A. 邻间的骰子之舞
为了方便,让整个过程结束后再复制一次。
令我们在有 \(a_1,a_2,\dots,a_m\) 个字符时进行了复制操作。需要满足:
- \(1=a_1<a_2<\dots<a_m\);
- \(a_m \ge n\);
- \(a_i \bmod a_{i-1}=0\)。
那么答案为 \(mx + y\sum_{i=2}^m \frac{a_i-a_{i-1}}{a_{i-1}}\)。
化简一下 \((m-1)(x-y)+ y\sum_{i=2}^m \frac{a_i}{a_{i-1}}\)。
令 \(k_i=\frac {a_i}{a_{i-1}}\),\(k_1 = a_1\)。
注意到 \(a_m = \prod_{i=2}^m k_i\)。所求是 \(\sum_{i=2}^m k_i\)。问题变成了:
找 \(m-1\) 个数,使得乘积 \(\ge n\) 且和最小。求这个最小和。
二分判断:
是否存在 \(m\) 个数,使得其和 \(\le mid\),且乘积 \(\ge n\)?
和一定,差小积大。肯定先平均分。剩下的能铺多少铺多少。
B. 星海浮沉录
若答案为 \(0\),则意味着数组中离得最近的两个 \(0\) 中间的数的数量 \(\ge x\)。
在答案不为 \(0\) 的情况下,若答案为 \(1\),则意味着数组中离得最近的两个 \(1\) 中间的数的数量 \(\ge x\)。
令 \(p_i\) 表示数组中离得最近的两个 \(i\) 中间的数的数量。那么答案为最小的满足 \(p_i \ge x\) 的 \(i\)。
用 set 维护这个 \(p\),那么找到答案可以线段树上二分。