Codeforces Round 612 题解
作者:互联网
[比赛链接]
http://codeforces.com/contest/1286
[题解]
\(A\)
不妨令 \(dp_{i , j , 0 / 1}\) 表示用了 \(i\) 个奇数 , \(j\) 个偶数 , 上一位奇数 / 偶数的最小值。
考虑当前位置奇数的情况 , 有
\(dp_{i , j , 0} = min\{dp_{i - 1 , j , 0} , dp_{i - 1 , j , 1} + 1\}\)。
偶数同理。
时间复杂度 \(O(N ^ 3)\)
\(B\)
最简单的方式是构造一个排列。
从根开始 \(DFS\) , 暴力合并子树 , 并将当前节点插入集合。
时间复杂度 \(O(N)\)
\(C\)
首先不难发现 :
\(1.\) 把一个子串中字符乱序相当于给定了出现次数
\(2.\) 对于同一个询问得到的两个子串,只有按照它们的长度才能把它们区分开。
先来考虑简单版本的问题 , 考虑 \([1 , N]\) 所有长度为 \(i\) 的子串和 \([2 , N]\) 所有长度为 \(i\) 的子串 , 将各个字符做差 , 就得到了 \([1 , i]\) 每个字符出现的次数 , 进一步将其与 \([1 , i - 1]\) 做差 , 就得到了第 \(i\) 位的字符。
这样的子串个数是 \({N \choose 2} + {N + 1 \choose 2} = N ^ 2\)。
接着考虑困难版。
不难发现 , 当 \(i\le\lceil\frac N2\rceil\) 时 , 原串每个字符贡献了 \(min\{j , N - i + 1 , i\}\) 次。而长度变为 \(i - 1\) 时 , 贡献变化当且仅当 \(\min(j,N-j+1)\ge i\) , 也就是 \(j\in[i , N - i + 1]\)。
于是长度为 \(i\) 的所有子串之和减去长度为 \(i − 1\) 的所有子串之和即为子串 \([i , N − i + 1]\) ,可以直观理解成两个梯形的面积相减。
然后再进行差分 , 就得到了 \(i\) 和 \((N - i + 1)\) 位置上的字符可能是哪两个。
这时就只需要知道前一半和后一半了。
子串个数 \(\binom{n+1}2+(\frac n2)^2<0.75(n+1)^2\)。
\(D\)
首先注意到一次碰撞必然发生在相邻的球之间 (相向而行、往左追击,往右追击)。
把这 \(2(N - 1)\) 种情况预处理出来 , 并按照时间从小到大排序。
这样 , 第 \(i\) 个碰撞作为第一次碰撞的概率即为前 \((i - 1)\) 次都没发生 , 而第 \(i\) 次碰撞发生了的概率。
那么每次相当于禁掉一个方向 , 而对于 \(i\) 禁了三个方向。
记 \(dp_{i , 0 / 1}\) 表示前 \(i\) 个位置 , 上一个位置是向左 / 右的概率。
直接转移是 \(O(N ^ 2)\) 的。 但可以用线段树维护矩阵优化。详见 [代码]
时间复杂度 \(O(NlogN)\)
\(E\)
标签:子串,字符,min,612,题解,复杂度,Codeforces,长度,dp 来源: https://www.cnblogs.com/evenbao/p/14509286.html