其他分享
首页 > 其他分享> > Codeforces Round 612 题解

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