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\)。考虑以下情况:
- \(n=1, m=1\), 有解
- \(n=1, m=2\), 无解
- \(n=1, m=3\), 无解
- \(n=1, m=4\), \(3,1,4,2\)
- \(n=1, m \geq 5\), 先奇数递增,再偶数递增,如\(1, 3, 5, 2, 4\)
- \(n=2, m=2\), 无解
- \(n=2, m=3\), 无解
- \(n=3, m=3\), \((6, 1, 8)\), \((7, 5, 3)\), \((2, 9, 4)\)
- \(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
很明显是欧拉定理的应用
然后已知\(\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)\)