题解:Codeforces Round 1096 (Div. 3) A ~ F
A. Koshary
全程如果不迈出移动到 \((a+1,b)\) 或 \((a,b+1)\) 的一小步,那么显然只能到达 \(a\) 和 \(b\) 均为偶数的点。而迈出一小步后只可以改变 \(a,b\) 其中一个的奇偶性,使其变成奇数。故判断 \(x,y\) 是否都为奇数即可。
B. Party Monster
由于把选中的子串拿出来后可以任意进行排列,所以不妨直接选中整个串,这样只用判断左括号与右括号能否一一对应,即判断二者个数是否相等。
C. Snowfall
积能被 \(6\) 整除,等价于其既能被 \(2\) 整除,又能被 \(3\) 整除。故将元素分为:
- 能被 \(6\) 整除
- 不能被 \(6\) 整除,能被 \(2\) 整除
- 不能被 \(6\) 整除,能被 \(3\) 整除
- 不能被 \(2\) 和 \(3\) 整除
可以发现,只要区间中包含第 1 类数或同时包含第 2 类和第 3 类数,那么这个区间里元素的积就可以被 \(6\) 整除。
对于第 1 类数,发现如果将其放到中间,则以其为原点左右扩展的区间均能被 \(6\) 整除,所以需要将其移到边上。同理,由于 \(2\) 和 \(3\) 在一起就相当于一个 \(6\),所以为了让扩展空间少一点,要让它们隔得远一点。故把 \(2\) 和 \(3\) 也分别放到两边去,注意 \(6\) 仍然是最边上的。
D. Palindromex
想要 \(\operatorname{mex}\) 最大,显然得包括 \(0\)。故考虑以左边 \(0\) 为中心的回文串,以右边 \(0\) 为中心的回文串,以及以左边 \(0\) 和右边 \(0\) 位置的中点为中心的回文串。暴力扩展即可。
E. It All Went Sideways
考虑求出对于每个位置 \(i\),将 \(a_i\leftarrow a_i - 1\) 时的答案。
首先,操作只会影响从下往上对应列的最高层。考虑哪些方块原本是不动的,对于第 \(i\) 层,应该是 \([k,n]\),其中 \(k = \max\{x \mid \forall j,\ x \le j \le n,\ a_j \ge i\}\),也即从 \(n\) 开始该层连续段的左端点。如果此时操作了第 \(x\) 列,那么就会对答案额外做 \(x - k\) 的贡献。除去不动的方块自然就是本来就会移动的方块,统计取 \(\max\) 即可。
考虑如何快速求 \(k\)。要求后缀所有数都大于等于一个数,其实就相当于后缀最小值大于等于这个数。所以预处理出后缀最小值,根据其单调性,可以从小到大枚举层数 \(i\),然后维护一个向右移动的指针 \(p\) 指向第一个后缀最小值大于等于 \(i\) 的位置,此位置即为 \(k\)。
F. It Just Keeps Going Sideways
继续沿用 E 题的方法求不动方块个数,可以发现移除一个方块所做的贡献等于其左边的方块个数。可以在从 \(n\) 扫到 \(1\) 的同时用树状数组维护当前下标在 \([1,i]\) 中的每一层的方块个数。
于是只需考虑原本就可移动的方块。对于一个下标为 \(i\) 的方块,其可以移动的距离等同于 \(n - i\) 再减去其右侧的方块个数。如果从右往左考虑,每考虑到一列就将当前列往右推,那么维护一个存储每一层方块个数的数组,推的操作可视为前缀加 \(1\)。一列中每一层所做的贡献等同于其下标 \(i\) 到 \(n\) 的距离减去右边的方块数,加起来就是 \(a_i\cdot (n - i) - \operatorname{sum}(1,a_i)\)。其中 \(\operatorname{sum}(i,j)\) 表示当前从第 \(i\) 层到第 \(j\) 层的方块个数。使用线段树维护即可。
时间复杂度 \(O(\sum n \log n)\)。

浙公网安备 33010602011771号