链接:http://codeforces.com/contest/1025
这一场大家fst得都好惨啊。
A:水题不多解释,注意$n=1$的时候输出Yes。
1 |
|
B:有$n$个数对,让你找到一个大于1的数字,使得这个数字为这个$n$对数中任意一个数的因数。
这个数一定是每一对数中某个数的因数,不妨建一个队列,把第一对中两个数的所有质因数去重后压到队里,看看队首的数是不是接下来的数对中任意一个数的因数。如果不是就出队,到最后看看有没有剩下数。
1 |
|
C:给你一个只有b和w两种字符的串s,希望让你通过一个操作获得尽可能长的bw交替的子串。这个操作是选中某一个位置切分,让两边都翻转。
考虑这个操作的本质,两头翻转以后,原本在串两端的字符接到了一起,中间的到了两端。再选一个位置也是这样,那么实际上两头是可以通过这个操作接到一起的。于是我们把整个串看成一个环,找最长的不超过字符串本身长度的bw串就行了。
1 |
|
D:给你n个数,问你能不能构成一棵二叉排序树,并且每2个相邻节点之间的gcd不是1。
首先想到了暴力枚举每一层的根节点,但是这样复杂度是$O(n^{logn})$的,显然不科学。
注意到一个点作为根的时候与它和它的儿子具体是谁有关系,我们考虑区间dp,维护$dp(i,j,k)$,表示$[i,j]$区间内的第$k$个数字能否做根,这个关系可以用bitset维护。
于是我们枚举长度和起止端点,特判端点作为根的时候能否成立,区间里面的数则直接枚举位置,看看这个k是否能分别做左右两棵树的根,如果能的话,直接给大区间做标记。
1 |
|