杂专选题,杂脑选长ycx
CF713E Sonya Partymaker
先考虑二分答案,然后每个点就可以往左或者往右覆盖一段长度为 \(mid\) 的区间,问最后能不能全部覆盖。
为了使问题更 easy 一点,我们先来考虑序列上的问题。不妨设 \(f_i\) 表示 \([1,A_i]\) 都已经被覆盖的情况下,往右最多能覆盖到哪里,最后判定 \(f_n\) 的值即可。
有两种转移:
- \(i\) 号点往右,直接转移到 \(f_{i+1}\),这需要 \(f_i\geq A_{i+1}-1\)。
- \(i\) 号点往右,转移到 \(f_j\),且 \(j\) 是第一个往左的,和 \(i\) 相接,中间一段全部往右。
这样转移看似是 \(O(n^2)\) 的,但是实际上,第二种转移只需要往后转移不超过两个点,因为如果超过两个点,则中间一段往右的只有最右边一个有意义,则可以将第一个改写成往左的,因此转移是 \(O(n)\) 的。
然后我们需要放到环上。在没有点从 \(n\) 号点往右覆盖到 \(1\) 号点 的情况下,我们只需要枚举前两个点哪个是往左的,分别 DP 一次即可。为了解决这个问题,我们对环进行旋转,将 \(n\) 号点与 \(1\) 号点之间的空段旋转成最大的。这样要么 \(mid\) 小于等于最大值,那么每个点都往右就能满足条件,要么一定不能从 \(n\) 号点覆盖到 \(1\) 号点,就可以 DP 了。时间复杂度 \(O(n\log m)\)。
CF1458D Flip and Reverse
首先这个形式太难看了,我们将 \(0\) 看成 \(1\),\(1\) 看成 \(-1\),作其前缀和。我们发现,这个操作就相当于选择两个相等的位置 \(l,r\),reverse 区间 \([l,r]\) 的前缀和数组。
接下来我们证明,只要一个数组每种元素的个数和原本的前缀和数组相同,并且相邻两个元素差的绝对值为 \(1\),则这个数组就是可以生成的。
考虑我们现在由原来的前缀和数组,已经使得前 \(i-1\) 个正确了,要构造第 \(i\) 个,如果第 \(i\) 个原本就是正确的直接跳过,否则总可以找到一个和 \(A_{i-1}\) 相等的位置,使其前面一个数为我们希望的 \(A_i\),就可以直接 reverse 这个区间。每一步都是可以构造出来的,所以只要满足这样的都可以构造出来。
然后考虑依次确定每一位。如果当前填 \(0\),则代表现在要往上走,那么,要么之后会走回当前点,要么当前点往下已经没有需要走的点了,否则就只能填 \(1\),容易 \(O(n)\) 判断。
WC/CTS2023 楼梯
感觉是长脑子的一个题。
首先我们发现,直接对着这个干是不太能做的,所以我们需要一点想象力,比如考虑右下边界。
一个方格生成格的边界格数量等于其右下边界长度减去 \(1\),也就是说,如果从左往右考虑整个楼梯的右下边界,将横着的看成 \(0\),竖着的看成 \(1\),那么我们相当于要找一对 \((0,1)\) 满足其距离为 \(q\)。
然后考虑 \(q\) 是边界长度的约数有什么用,你会发现,右下边界第一个各自是 \(0\),最后一个是 \(1\),其中恰好差了 \(q\) 的倍数,则可以二分,取一个除 \(q\) 意义下的中点,然后如果这个点是 \(0\),就取右半边,否则取左半边即可。
用平衡树维护,时间复杂度 \(O(n\log V\log n)\)。

浙公网安备 33010602011771号