Codeforces Round 903 (Div. 3)
D题被hack了
哭了
第一题简单的
只用把字符串重复的同时尝试匹配,然后判断就好了,只是需要一点代码能力
第二题,也很简单
最多剪断3次,就先从小到大排序,然后用最小的,看看大的是他的几倍,如果不是几倍的关系就不可能完成,如果是就算要几次就好了
第三题,也很简单,很明显,对于一个格子,在它旋转90度后,它需要与转到的地方的格子相同,但是这个格子也同样被旋转了
所以它要与它转到的位置相同,所以这就是一个环,我们需要让这个换上4个位置的格子都相等,这是唯一合法的情况
第四题,一个简单的质因数分解,但是我的代码可能细节没做好,导致被卡常数了。。
很明显,我们每一次操作都把一个数字除掉再给另一个乘上,这个操作的最小单位就是质数。
所以我们就把每一个数字质因数分解,然后计算每一个质因数出现了几次
如果这个数列能够通过这种操作来让每一个数字相等,那每一个质因数出现的次数都应该是n的倍数次
第五题,稍微有点难度了
一个被设计的很简单的dp,我们设f[i]表示从n到i保证合法时操作的最小次数
那很明显,转移就是f[i] = f[j] + j - i + 1 - a[i] (j > i)
转移方程就是f[i] = min(f[j] + j) - a[i] - i + 1 , (a[i] + i - 1 <= j <= n)
然后发现决策集合时从后往前单调增加元素的一个最小值,可以直接维护
但是这一题是我队友写的,最近增在dp复健,所以后面应该会专门写一篇博客来分析这题还有下一题(都是dp
那第六题我暂时还不会,下一篇博客讲
第七题也稍微有点难度
题目要求区间修改和查询区间内是否有回文串
乍一想是有点难的
但是仔细想想,我们其实完全不关心每一个回文串的长度,而是只关心回文串是否存在
一个回文串是否存在是由其中心是否存在决定的
所以我们对于每一次修改,其实只需要关注它修改的边界部分是否会创造或者是破坏中心
而中心的判断是O(1)的
对于区间查询,我们就直接用直接统计区间内存在几个回文串中心就好了
直接线段树维护,要两颗,一棵是a[i],一棵维护中心数量
那就是O(nlogn)
解决
可惜时间不够了(两个人都时间不够,还是太菜了。。。。)