Codeforces Round 979 Div.2
可能是最近VP最好的一场? 😢
5题,3728
前面签到写的比较顺,然后从 D 开始出现问题了。
D 写的是很麻烦的做法,导致耽误了很多时间。
E 感觉思路出的比较快,但是 DP 转移一开始想错了,导致写和调用了很长时间,最后清空出问题罚了两罚,尾杀了算是还可以吧。(但是 48 min 写完 D,直到 133 min 才过 E 属于是有点菜了)。
F 属于是同档里面的简单题,感觉如果前面能快一点,是能写的。
A. A Gift From Orangutan
直接让 \(b_1 = \min_{i = 1} ^ n a_i\ , c_1 = \max_{i = 1} ^ n a_i\) 就可以了。所以给 \(a\) 拍个序, 答案就是 $(n - 1) \times (a_n - a_1) $ 。
Sol: Link
B. Minimise Oneness
感性的猜一下结论就可以了,感觉挺好猜的。
首先不难观察到,只要 01 串 \(s\) 里面含有 1 ,那么 \(f(s)< g(s)\) 一定成立。而且如果 \(s\) 中只含有一个 1 ,那么 \(g(s) - f(s) = 1\) 。
依据上面的说法,很显然增加 1 的数量不会让答案变得更小,所以只要随意让一个位置为 1 就可以了。
Sol: Link
C. A TRUE Battle
又是一道结论题。
通过观察不难发现,如果 01 串 \(s\) 中存在连续 3 个 1 的字串,那么最后一定是 Alice 赢;如果 01 串 \(s\) 中第一位或者最后一位为 1 ,那么最后一定是 Alice 赢。
现在考察最多只含有两个连续 1 的情况,那么串中会出现形如 ”\(0110\)“ 的子串,这个字串中一共有 3 个位置可以插入逻辑运算符,因为 Alice 为先手,所以她可以至少在这三个位置中插入两个 \(\or\) ,那么这个子串的结果一定是 \(1\) 。最后还是 Alice 必胜。
对于其他的情况,可以说明 Alice 一定赢不了。
总结:只要 01 串中有连续两个 1 或者 开头,结尾中有一个是 1 。都是 Alice 必胜。
Sol: Link
D. QED's Favorite Permutation
不是一道难题,但是写起来有贼好写的和贼难写的。(我选了贼难写的 😢 )。
关键的观察就是:如果 \(s_i = L, s_{i + 1} = R\) 。那么 \(i\) 左边的数无法通过操作交换到右边,同理右边的也到不了左边。
我们把这样的 \(i\) 称为一个壁垒。那么对于原题而言,只要所有相邻的两个壁垒 \(x,y(x< y)\) 之间的数字满足,\(perm(p_{x+1},p_{x+2},...,p_y) = perm(x + 1,x+2,...,y)\) 。
贼简单的写法:
令 \(f_i = max_{j = 1} ^i p_j\) ,如果 \(f_i = i\) ,让 \(d_i = 1\) ,否则让 \(d_i = 0\) 。
对于每一个壁垒 \(i\) ,如果 $d_i = 0 $ ,那么说明这里这个壁垒使得有些数回不到应该到的地方,我们标记这个下标。
显而易见的,只要没有一个下标被标记,这个 \(s\) 就是好的。否则就是不好的。
对于修改操作,只要看一下修改的位置和左右两边的字符修改一下就可以了。
修改是 \(\mathcal O(1)\) ,预处理是 \(\mathcal O(n)\) 。
复杂度:$\mathcal O(n + q) $
Sol: Link
贼复杂的写法:
需要判断的是一个壁垒区间内 \(p\) 数组的排列和下标的排列是否相同,比较直观的想法是可以做类似于哈希的做法。
具体的,直接用一个链表维护所有的壁垒(写一个 set,方便寻找壁垒下标和删除壁垒下标),然后用区间和和区间最大值来判断是否合法。
很直观显然的做法,修改是 \(\mathcal O(\log n)\) ,预处理是 \(\mathcal O(n\log n )\) (ST 表的复杂度)。
复杂度:\(\mathcal O(n\log n + q\log n)\) 。
Sol: Link
E. MEXimize the Score
考虑每个数对答案的贡献。
令 \(dp_{i,j}\) 表示选完了 \(0\sim i\) 的数,这 \(i+1\) 种数里面,数量最少的选了 \(j(j >0 )\) 个的方案数。
令 \(hve_i\) 表示 \(i\) 这个数一共有多少个。(\(\sum\limits_{i = 0} ^ n hve_i = n\))
根据上面,可以知道状态数最多只有 \(n\) 个。
考虑在每个状态的地方统计答案。具体而言,如果 \(dp_{i,j} = x\) ,那么对于到 \(i\) 为止的这 \(x\) 种选法,答案至少由 \(i\) 增加到了 \(i + 1\) 。即对于这些选择方案,答案至少增加了 1 。
于是 \(dp_{i,j}\) 对答案的贡献为 \(x\times j\times 2^{n - \sum_{i = 0}^i hve_i}\) 。 最后乘上 \(2^{n - \sum\limits_{i =0} ^ i hve_i}\) 是由于 \(dp_{i,j}\) 只考虑了小于等于 \(i\) 的数, 二后面的数无论怎么选,这些选法的答案不会小于 \(i + 1\) 。
现在考虑转移。有以下两种转移:
\(dp_{i + 1,j} = \sum\limits_{k = j} ^ {hve_i} dp_{i,k} \times \binom{hve_{i + 1}}{j}\)
\(dp_{i+1,j} = dp_{i,j}\times \sum\limits_{k = j + 1} ^ {hve_{i + 1}} \binom{hve_{i +1}}{k}\)
这两种转移都可以优化。对于第一种,把二项式拿出来,剩下的就是一个后缀和。对于第二种,在正着转移的时候后面的和是单调递减的,直接维护一下就可以了(详见代码)。
初始化的时候,直接令 \(dp_{0,i} = \binom{hve_0}{i}\) 就可以了。(注:记得在这里也要统计对答案的贡献)。
复杂度:\(\mathcal O(n)\)
Sol: Link
F. Orangutan Approved Subarrays
不难观察到对于一个区间 \([L,R]\) ,当且仅当这个区间内存在形如:\(L \leq i <j<k<l \leq R\) ,\(b_i = b_k, b_j = b_l, b_i \neq b_j\) 的子序列时,该区间不是好的区间(即不是 orangutan-approved 的区间)。
考虑对于每个右端点 \(R\) 计算出最小的 \(L\) , 使得 \([L,R]\) 是好区间,而 \([L-1,R]\) 不是好区间。记 \(d_R = L\) 。不难发现,\(d_R\) 随着 \(R\) 的增加,单调不降。
这个过程可以使用双指针。双指针 \(l,r\) 维护了当前确定的好区间。
令 \(prev_i\) 表示 \(b_i\) 这个数在 \(i\) 之前的出现位置(没有记为 \(-1\) )。
当我们计算完 $ d_r$ ,并开始计算 \(d_{r+1}\) 时,进行如下操作:
令 \(x = prev_{r + 1}\) 。
如果 \(x < l\) 或者 \(x = -1\) ,那么直接令 $d_{i+1} = l $ 。
否则需要考察区间 \([l, x - 1]\) 之前是否存在数在 \([x+1, r -1]\) 之间也出现过。
这个判断可以使用一个维护区间最大值的线段树解决。具体的,每个位置维护该数下一次出现的坐标,然后查询区间 \([l, x-1]\) 的 \(\max\) 就可以了。(注:每个位置的下一次出现应该是动态更新的,即当考察完 \(r\) 时,在线段树上更新 \(prev_r\) 的值为 \(r\) 。)
全部结束之后,查询就是 \(\mathcal O(1)\) 了。
复杂度: \(\mathcal O(n\log n + q)\) 。
Sol: Link
G. The Destruction of the Universe
先写一下 Easy 版本的把,Hard 看懂了,但还没有调过。
关键的观察。考察对于一个给定的区间组(\([l_1,r_1],[l_2,r_2],...,[l_v,r_v]\) ) 答案怎么计算。
首先设答案为 \(0\) ,重复以下过程:
- 令 \(x\) 为 所有可选的 \(i\) 中 \(r_i\) 最小的。
- 令 \(y\) 为 所有可选的 \(i\) 中 \(l_i\) 最大的。
- 如果 \(r_x < l_y\) ,令答案加上 \(l_y - r_x\) ,并标记 \(x,y\) 为不可选。
- 若 \(r_x \geq l_y\) ,结束。
显然的结束时,所有的区间都有公共部分。这种做法得到的答案是最小的(证明略)。
考虑上面的过程,我们发现对于一对区间 \((i,j)\) ,不妨设 \(r_i < l_j\) 。
这一对会对答案产生贡献,当且仅当在一种选法中:恰有 \(x\) 个 \(r_p < r_i\) ,恰有 \(x\) 个 \(l_q > l_j\) 。
所以设对于所有的区间:一共有 \(g\) 个 \(r_p < r_i\) ,一共有 \(h\) 个 \(l_q > l_j\) 。对答案的贡献为:\(\sum\limits_{x = 0} ^ g (l_j - r_i) \times \binom{g}{x} \times \binom{h}{x} \times 2^{n-2-g-h}\) 。
化简一下有:
\(\sum\limits_{x = 0} ^ g (l_j - r_i) \times \binom{g}{x} \times \binom{h}{x} \times 2^{n-2-g-h} = \sum\limits_{x = 0} ^ g (l_j - r_i) \times \binom{g}{g -x} \times \binom{h}{x} \times 2^{n-2-g-h} = (l_j - r_i) \times \binom{g + h}{g} \times 2^{n-2-g-h}\)
这下每一对答案计算的复杂度就是 \(\mathcal O(1)\) 的。
复杂度:\(\mathcal O(n^2)\)
Sol: Link