梦熊苍穹计划(NOI 模拟赛)Round 28 题解

时日不多了,能进吗。

Round 28

A

Tag:Kruskal 重构树。

我的 2 log 明明卡到了 1s 以内啊,怎么完全坠机了,凸(艹皿艹 )。

考虑一个点只经过编号小于它的点能到达的点集。发现这是一个 Kruskal 重构树的结构。

所以你发现就求出 \(2\) 个点 \((x,y)\) 满足在 \(T_1\)\(x\)\(y\) 的祖先,\(T_2\)\(y\)\(x\) 的祖先。

这个随便画一画大概就会做了。

B

Tag:分治。

这是啥啊,看不懂梦熊给的题解。

我们先给出一组 \(3\) 次操作的方法,这样问题就好办很多:

先求出前缀和数组。如果所有元素都 \(\ge 0\),可以一次操作实现;都 \(\le pre_n\),可以一次操作实现;都 \(\le 0\) 或者都 \(\ge pre_n\) 可以两次操作实现;

如果最大值在最小值的后面:image

如果最大值在最小值的前面:image

\(0\) 次和 \(1\) 次都是容易处理的,关键是 \(2\) 次。

实际上,你要发现,\(1\) 次处理需要满足,所有数 \(\le 0\),或者做 \(1 \to n\) 或者 \(n \to 1\) 的推平。

\(2\) 次如果含有取相反数,将其调换到后面去,有化归为 \(1\) 次的问题。

如果是最后一次是推平,那么显然是 \(1 \to n\) 最优。第一次如果是同向的推平,容易证明把一个端点卡到最前面是更优的,所以变为 \(O(n \log n)\) 就可以用线段树检验的问题。

烦人的是这种推平:image

这时候我认为所有调整都是没啥用的,用一些正常人类的手段。

我们不妨假设最后一次推平是 \(1 \to n\)。这个本质上要求操作一次之后 \(pre_i \ge 0\) 恒成立。

考虑你第一次推平是 \(r \to l\),原有的 \(pre\) 数组的前缀和得到 \(Pre\)

发现什么呢。就是 \(<l\) 的位置新的前缀和是 \(pre_i\)\(>r\) 的位置新的前缀和是 \(pre_i-pre_r+pre_{l-1} + \sum_{t=l}^{r} pre_r-pre_{t-1} = pre_i + pre_r \times (r-l) - Pre_{r-1} + Pre_{l-1}\)

\([l,r]\) 之间的相当麻烦,大概是

\[ pre_{l-1} + \sum_{j=l}^i pre_r-pre_{j-1} = pre_r \times (i-l+1) - Pre_{i-1} + Pre_{l-1} \]

直接做最大的问题就是,你不能判断究竟是哪个限制。对于这种问题,不妨考虑主动出击,使用分治!

你先枚举 \(l\),让它把 \([l,mid]\) 都给满足了。而你怎么对于一个 \(l\) 算出可能的 \(r\) 呢。

你发信啊它实际上只对 \(Pre_r\) 有限制,而且你发现这个本质是过 \((l-1,-Pre_{l-1})\)\((i,-Pre_{i-1})\) 的凸包做切线。我不清楚是否题目限制的 \(-1 \le a_i \le 1\) 可以把这部分二分的复杂度降到均摊线性。

然后是 \(r\),他去处理 \([mid+1,r]\)。这一段有个啥特征呢,就是 \(i\)\(l\) 没有乘积。所以说,我们先对于 \(r\) 求出限制最紧的 \(l\)

然后你发现此时你要最大化的是 \(-l \times pre_r + Pre_{l-1}\),惊奇的发现和最上面那个限制竟然是一样的。

所以动态维护 \(lim_l \le v\)\((l,Pre_{l-1})\) 的凸包(还要检查一下 \(l\) 之前的,不太重要似乎)。使用平衡树实现。

所以这是 \(O(\log^2)\) 的,为啥有老哥会单 log,破防了。

C

Tag:支配队构造,KDT。

我觉得这个题至少是善良的。

假装你求出了 \(O(n \log v)\) 个支配对,你接下来要怎么做呢(具体怎么构造支配对,后面再写 qwq)

你将他们 \(x<y\) 扔到二维平面上,定义其权值为 \(b_x \oplus b_y\)

然后你发现你的修改相当于给一个 2-side 矩形里面的所有数的权值异或 \(1\),然后查询一个 2-side 矩形里所有数的代价的最小值。

这个东西复杂度直接是 \(O(q \sqrt {n \log v})\)

但是为啥查询比修改要多呢,因为查询可以神秘最优性剪枝但是修改不行,也就是前者完全跑不满。

ok 就这样把,我下播了。

posted @ 2025-06-21 00:26  M2GA  阅读(18)  评论(0)    收藏  举报