Codeforces Round #454 (Div. 1)

Codeforces Round #454 (Div. 1)

A. Shockers

题目描述:主持人心里想一个字母,然后选手说出一个字符串,如果该字符串中有那个字母,则那个人遭电击。选手可以猜测那个字母,猜测错误会遭受电击。给出整个比赛过程,问如果选手在能判断出字母时立刻猜测,则可以避免多少次电击。数据保证在最后一次猜测之前,选手猜的都错。

solution
模拟。

时间复杂度:\(O(10^5)\)

B. Seating of Students

题目描述:有\(n*m\)个座位,从上到下,从左到右对座位进行编号,现将座位调乱,使得每个座位的四相邻没有原来的四相邻的任何一个,判断是否存在一种方案,若有,则输出任一方案。

solution
不失一般性,可设\(n \leq m\)。考虑以下情况:

  1. \(n=1, m=1\), 有解
  2. \(n=1, m=2\), 无解
  3. \(n=1, m=3\), 无解
  4. \(n=1, m=4\), \(3,1,4,2\)
  5. \(n=1, m \geq 5\), 先奇数递增,再偶数递增,如\(1, 3, 5, 2, 4\)
  6. \(n=2, m=2\), 无解
  7. \(n=2, m=3\), 无解
  8. \(n=3, m=3\), \((6, 1, 8)\), \((7, 5, 3)\), \((2, 9, 4)\)
  9. \(2 \leq n, 4 \leq m\), 偶数行水平循环移动两位,偶数列垂直循环移动一位,则本来垂直相邻的座位变为相隔两列,本来水平相邻的座位变为对角。

时间复杂度:\(O(nm)\)

C. Party

题目描述:有\(n\)个人,有\(m\)个相识关系,表示某两个人认识。先进行如下操作:每次选一个人,将这个人认识的人相互介绍认识。问最少多少次操作使得所有人相互认识,并输出最少操作下的任意一种方案。

solution
首先要知道,选人的顺序不影响最终的结果。因此每个人只有选和不选两种情况,这时可以做一个dp,首先可以预处理(压位)出每个人的认识的人\(neighbour[i]\)\(connect[sett]\)表示当选了\(sett\)里的人时,\(connect[sett]\)里的人相互认识。
初始时\(connect[2^i]=neighbour[i]\),然后将\(connect[sett]\)表示的集合记为\(v_i\)(\(v_i\)为一元素),那么\(connect[sett|2^{v_i}]|=neighbour[v_i]\)
最终解就是\(connect[sett]==2^n-1\)\(sett\)对应的集合元素个数最少。

时间复杂度:\(O(2^nn)\)

D. Power Tower

题目描述:给定一个\(n\)个数的序列\(a_i\)与一个数\(m\),有\(q\)个询问,每个询问给出一个区间\([L, R]\),求\(a_L^{(a_{L+1}^{(a_{L+2}^{...^{a_R}})})}\%m\)

solution
很明显是欧拉定理的应用

\[a^x=a^{x\% \phi (m)+\phi(m)} mod (m), 当x\geq \phi(m) \]

然后已知\(\phi(\phi(m)) \leq \frac{m}{2}\),所以在\(log(m)\)时间内\(\phi(m)=1\),所以暴力递推就好了

时间复杂度:\(O(qlogm)\)

E. Reverses

题目描述:给定两个字符串,问是否可以通过翻转某些子串(不重叠),使得第一个字符串变为第二个字符串。输出最少翻转个数与方案,或无解。

solution
首先要知道一个非常重要的点:如果有解,将两个字符串错位拼接后,字符串会变为偶数回文串与相同字符交替。如:
abcxxxdef
cbaxxxfed
acbbcaxxxxxxdfeefd
问题转化为用最少的偶数回文串(不重叠)覆盖拼接后的字符串,使得没有被回文串覆盖的部分各自字符相同。
\(f[i]\)表示前\(i\)个字符需要偶数回文串覆盖个数,当\(st[i]==st[i-1]\)时,\(f[i]=min(f[i], f[i-2])\),剩下的转移时关于偶数回文串的,貌似时一个经典问题,但论文看得不太懂,有空再更新。

时间复杂度:\(O(nlogn)\)

posted @ 2018-01-07 22:02  GerynOhenz  阅读(274)  评论(0编辑  收藏  举报