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\) 连通,但是不对,例如样例的图:

img

只考虑 \(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_i=\begin{cases} 1,&a_i=y\\ -1,&a_i \not ={y} \end{cases}\]

上式分子的最大值为 \(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)\)

参考实现

posted @ 2025-06-09 10:24  蒻蒻虫  阅读(113)  评论(0)    收藏  举报