Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2)

(感觉这场难度都不大啊)

A. Digits Sum

$lfloorfrac{n+1}{10} floor$

B. Reverse String

枚举

C. Penalty

枚举

D. Backspace

倒着试图匹配,如果不匹配就连删两个。

E. Permutation Shift

注意到 $mleqfrac{n}{3}$,则一个合法排列的环数 $cgeqfrac{2n}{3}$,长度为 $1$ 的环数 $dgeqfrac{n}{3}$(这是由于 $d+2(c-d)leq n$),因此至多只要检查 $3$ 个。

F. Pairwise Modulo

新加一个数的时候,要计算他 $mod$ 其他数 和 其他数 $mod$ 他,分别用两个 BIT 维护即可。由于所有数互不相同,BIT 上修改的次数为调和级数,总复杂度两个 log。

G. Common Divisor Graph

分个类讨论一下:如果两个数都是偶数,必然连通,那么答案为 $0$。如果两个数恰好一个是偶数一个是奇数,且不连通的话,答案为 $1$。这两个都很好搞,求出所有数的质因子做并查集即可。如果两个数都是奇数,且不连通,答案要么为 $1$ 要么为 $2$,如果存在一个数使得操作它之后能让这两个数连通,则答案为 $1$,这个只需要对每个数求出操作它之后能连通的所有连通块,存在一个 set 中即可。

H. XOR and Distance

建出 trie,考虑用 $(p, mask)$ 表示节点 $p$ 所在子树中,这些数异或的值为 $mask$,最小缝隙和最小值最大值是多少。由于 $mask$ 只需要考虑子树内的位,因此总状态数 $O(k2^k)$。然后只要分情况讨论,进行转移即可。

I. Stairs

把极长的这种连续段找出来,每个数肯定恰好被覆盖一次。所以根据 $a$ 数组可以直接推断出所有极长的连续段的长度组成的序列 $b$。现在的问题就变成了给定 $b$ 求满足 $b$ 的排列个数。在相邻两个连续段之间的断点不好处理,考虑容斥,即强制某些连续段被合并,然后计算方案的话,就是合并后的连续段数的阶乘 × 2 的长度非 1 的连续段个数次方。考虑分治 NTT,记录最左和最右连续段旁边的这两个断点是否被合并,就可以了。

原文地址:https://www.cnblogs.com/Master-Yoda/p/15175698.html