Codeforces Round 1029 (Div. 3) 部分题解
E. Lost Soul
对于一个位置若 \(a_i=b_i\) ,则可以把前面的值全部改成相同的,考虑找最大的能得到 \(a_i=b_i\) 的位置,结论如下:
- 若 \(a_i=b_i\) 显然。
- 若 \(a_i=a_i+1\) 或 \(b_i=b_i+1\) ,一次操作即可。
- 对于 \(j>i+1\) ,若出现了 \(a_i\) 或出现了 \(b_i\) 则可行。
针对第三条,一个数可以类似折返得往移动,这表明移动奇数次能到对面的位置(\(a-b,b-a\)),偶数次能到自家位置(\(a-a,b-b\)),加上题目的删除一列的能力,此时能反转奇偶,就能到达所有位置。注意这个对 \(j=i+1\) 是不成立的,要特判。
F. Wildflower
注意到若叶子数超过 \(2\) 是无解的,因为叶子的权值只能是 \(1\) 或 \(2\) 。
若叶子数是 \(1\) ,则是一条链,方案数是 \(2^n\) 。
否则是分叉的形式,记两条分叉链的长度是 \(s_1,s_2\) ,公共祖先组成的链长是 \(w\) ,不妨 \(s_1>s_2\) 。
若 \(s_1\) 的叶子填 \(1\) ,则 \(s_2\) 的叶子只能写 \(2\) ,\(s_1\) 再往上一层只能写 \(2\) ...... 最后剩余 \(s_1-s_2-1\) 个自由位置任意填。
若 \(s_1\) 填 \(2\) ,则 \(s_2\) 叶子填 \(1\) ,且 \(s_2\) 往上只能填 \(2\) ,\(s_1\) 填 \(2\) ...... 最后有 \(s_1-s_2\) 个自由位置。
方案数为 \(2^{s_1-s_2-1}+ 2^{s_1-s_2}\) ,在 \(s_1=s_2\) 时特判方案数为 \(2\) ,最后乘上 \(2^w\) 即可。
G - Omg Graph
注意是最大值 加 最小值,最小值越小越好,别想成双指针了(乐)
一个 naive 的想法是最小值就是最小边权一定能取到,顺序加入大值边直到 \(1,n\) 连通,但是不对,例如样例的图:

只考虑 \(w\leq 6\) 的话,\(4\) 的边权是不可达的。
稍微更改一下,最小边权取 \(1,n\) 联通块内的最小边权就行了,按边权顺序加边,当 \(1,n\) 连通时判断一下,用并查集维护即可。
H. Incessant Rain
将目光聚集在一个数上,数字 \(y\) 在序列 \(b\) 上的 \(k\) 众数为 \(cnt_y-\lfloor\frac{|b|+1}{2}\rfloor=\lfloor\frac{2cnt_y-|b|}{2}\rfloor\) 。
设:
上式分子的最大值为 \(b\) 的最大子段和,对于带修的情况,可以使用线段树维护最大子段和。
每次询问会加入一个数并删除一个数,所有数字的 \(b_i\) 的修改总数是 \(O(n)\) 的。
我们可以离线得考虑每一个数字,找出和这个数有关的所有修改,按询问顺序修改 \(b\) 序列,查询最大子段和。
最后每个数字会在一些询问位置上更新一个答案,对于该数字而言,其答案序列为形如 \(s_1,s_1,s_1,s_2,s_2,s_3\cdots\) 的形式,即在某些位置更新答案并向后延申。将所有数字整合,最终答案就是每个数字该位置的答案最大值。
我们只记录每个数字更新答案的具体位置,用 set 维护每个数字在当前询问位置的最大值即可,复杂度 \(O((n+Q)\log n)\) 。

浙公网安备 33010602011771号