Educational Codeforces Round 94 简要题解

比赛链接
https://codeforces.com/contest/1400

题解

\(A.String Similarity\)

有很多种构造方式。
最简单的一种是\(s_ns_ns_n....s_n\) 时间复杂度 : \(O(N)\)
代码 : https://codeforces.com/contest/1400/submission/90913221

\(B. RPG Protagonist\)

注意到 \(cnts \leq 2 * 10 ^ 5\) , 那么可以枚举一个人选了多少个 \(swords\)
贪心即可。 时间复杂度 : \(O(N)\)
代码 : https://codeforces.com/contest/1400/submission/90929076

\(C. Binary String Reconstruction\)

对于\(s\)中的每个\(0\) , 可以知道 \(w_{i-x} , w_{i+x}\) 都为\(0\)
将其它的值都赋为\(1\) , 最后判断是否符合要求。 即可。
还有一个做法是 \(2-SAT\) , 不过太麻烦了。
时间复杂度 : \(O(N)\)
代码 : https://codeforces.com/contest/1400/submission/90935046

\(D. Zigzags\)
枚举\(i , k\) , 用乘法原理计算贡献。
具体实现时只要维护两个数组 , \(in , out\) 即可。
时间复杂度 : \(O(N^2)\)
代码 : https://codeforces.ml/contest/1400/submission/90943961

\(E. Clear the Multiset\)
首先考虑没有\(2\)操作怎么做。
这是个经典问题。 对于所有的 \(a_i > a_{i-1}\) , 都对答案造成了 \(a_i - a_{i-1}\) 的贡献。
那么如果有\(2\)操作怎么做呢?
考虑动态规划。 设 \(dp_{i,j}\) 表示前 \(i\)个数 , 第 \(i\) 个数是原数组中第 \(j\) 个数的代价和最小值。
直接转移即可。
时间复杂度 : \(O(N ^ 2)\)
代码 : https://codeforces.ml/contest/1400/submission/90959792

\(F.x-prime Substrings\)
将所有 "\(x-prime Substrings\)" 插入 \(AC\) 自动机。这个复杂度是可以接受的。
然后就是一个朴素的动态规划了。
\(dp_{i,j}\) 表示第前 \(i\) 个字符 , 当前在 \(j\) 号节点的最小值。
时间复杂度 : \(O(NM)\) ( \(M\) 为自动机节点数)
代码 : https://codeforces.ml/contest/1400/submission/91011980

\(G.Mercenaries\)
首先考虑没有 \(M\) 个限制怎么做。
枚举选了多少个 ,假设选了 \(N\) 个 , 记 \(Li \leq N , Ri \geq N\)的有\(K\)个。 那么贡献即为 \(N \choose K\)
如果有 \(M\) 个限制怎么做呢?
考虑直接容斥原理。 用至少\(0\)个不满足 - 至少\(1\)个不满足 + 至少\(2\)个不满足 - .... + ...
预处理一些组合数的前缀和。 就可以做到 \(O(2^M * M + NM)\) 的复杂度。
代码 : https://codeforces.ml/contest/1400/submission/91009317

posted @ 2020-08-26 12:37  evenbao  阅读(384)  评论(2编辑  收藏  举报