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))