梦熊苍穹计划(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\) 可以两次操作实现;
如果最大值在最小值的后面:
如果最大值在最小值的前面:
\(0\) 次和 \(1\) 次都是容易处理的,关键是 \(2\) 次。
实际上,你要发现,\(1\) 次处理需要满足,所有数 \(\le 0\),或者做 \(1 \to n\) 或者 \(n \to 1\) 的推平。
\(2\) 次如果含有取相反数,将其调换到后面去,有化归为 \(1\) 次的问题。
如果是最后一次是推平,那么显然是 \(1 \to n\) 最优。第一次如果是同向的推平,容易证明把一个端点卡到最前面是更优的,所以变为 \(O(n \log n)\) 就可以用线段树检验的问题。
烦人的是这种推平:
这时候我认为所有调整都是没啥用的,用一些正常人类的手段。
我们不妨假设最后一次推平是 \(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]\) 之间的相当麻烦,大概是
直接做最大的问题就是,你不能判断究竟是哪个限制。对于这种问题,不妨考虑主动出击,使用分治!
你先枚举 \(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 就这样把,我下播了。



浙公网安备 33010602011771号